Skip to content

Turn the fork into the Mobbin agent plugin - #1

Merged
kingstarfly merged 7 commits into
mainfrom
devin/prj-2411-mobbin-agent-plugin
Aug 7, 2026
Merged

Turn the fork into the Mobbin agent plugin#1
kingstarfly merged 7 commits into
mainfrom
devin/prj-2411-mobbin-agent-plugin

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Summary

Turns the forked agent-plugins-example into a real Mobbin plugin that installs our hosted MCP server into any Agent Plugins 1.0.0 client. Scoped to the MCP server — no skills — so there's exactly one thing to get right.

The whole package is two files:

plugin.json    name "mobbin", closed schema
mcp.json       mobbin → streamable-http → https://api.mobbin.com/mcp

No credential ships in it. The server answers unauthenticated requests with WWW-Authenticate: Bearer resource_metadata=…, so the client discovers the OAuth 2.0 + PKCE flow and owns the token.

npm run validate (also a CI job) checks those two files against the canonical 1.0.0 schemas, vendored under schemas/1.0.0/ so CI needs no network. The schemas are closed and strict, so a stray key or typo silently breaks loading in every client with no error you'd otherwise see.

Why there are no compatibility shims

Earlier revisions of this branch carried .mcp.json, .claude-plugin/ and .codex-plugin/, purely to satisfy plugins@1.3.4 (vercel-labs), which reads only those paths. That CLI is one vendor's installer, not part of the standard — and spec §7.2.2 points the other way:

Clients that support MCP servers MUST load configuration only from mcp.json at the plugin root.

So they're gone, and the README now points at each client's own install path rather than a single npx command. Claude Code — the client the original evidence here came from — isn't on the compatible-clients list either; Mobbin's claude mcp add docs already cover it.

Evidence

Verified end to end in VS Code 1.132.0, a conformant client, against the live server: loads from root mcp.json alone, server appears under the manifest name mobbin, real OAuth consent, exactly three tools, and a search_sections call whose returned mobbin_urls resolve. Screenshots and recording in the verification comment.

Not tested: Cursor, GitHub Copilot, ChatGPT/Codex, Kiro.

Follow-ups

  • The mobbin-design-research skill (tool selection, query phrasing, mobbin_url citation rules) is written and verified, held back to keep this PR to one concern.
  • Cursor is worth revisiting: it loads the plugin and connects the MCP server while logged out, but its chat surface is behind a hard login gate, and it rejects the ~/.cursor/plugins/local/ symlink its own docs recommend.

Link to Devin session: https://app.devin.ai/sessions/27e2106025084084a3c691121a0f141a
Requested by: @kingstarfly

Replace the upstream agent-plugins-example contents with Mobbin's own
plugin: the hosted MCP server over Streamable HTTP plus a design-research
skill, and a validator/CI that enforces Agent Plugins 1.0.0 conformance.

Refs PRJ-2411

Co-Authored-By: xingxiang <xingxiang@twotreesgroup.com>
@kingstarfly kingstarfly self-assigned this Aug 7, 2026
@kingstarfly
kingstarfly self-requested a review August 7, 2026 05:43
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author
Original prompt from xingxiang

SYSTEM:
=== BEGIN THREAD HISTORY (in #api-mcp) ===
Ong Xing Xiang (U05SGQKU3AS) [ts=1786080790.615339]: Finally a standard for plugins
<https://agent-plugins.org/|agent-plugins.org>

Compatible clients:
<https://agent-plugins.org/compatible-clients|agent-plugins.org/compatible-clients> includes Cursor, ChatGPT/Codex, VSCode, GitHub Copilot, Kiro currently

<most_recent_message>
Ong Xing Xiang (U05SGQKU3AS) [ts=1786080897.794959]: @Devin let's make this an issue - and then get started with it
Forked a <https://github.com/mobbin/mobbin-agent-plugin|new repo here>
in terms of verification, research ways for you to test that it works as expected
</most_recent_message>
=== END THREAD HISTORY ===
Channel ID: C0AM5BHRL5P
Thread URL: https://mobbinco.slack.com/archives/C0AM5BHRL5P/p1786080790615339?thread_ts=1786080790.615339&amp;cid=C0AM5BHRL5P

The latest message is the one right above that tagged you. The <most_recent_message> is the message that you should use to guide your goals + task for this session, and you should use the rest of the slack thread as context.
A [ts=...] marker on a Slack message is that message's timestamp. To act on a specific message with the slack tool (e.g. adding an emoji reaction via the reaction command), pass that value as timestamp along with the Channel ID — no extra lookup call is needed.

@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI' or '@devin'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

Co-Authored-By: xingxiang <xingxiang@twotreesgroup.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

End-to-end verification

Installed the package into Claude Code (2.1.224) from a local path, completed the real OAuth flow against api.mobbin.com/mcp in the browser, and ran a design-research prompt.

Check Result
npx plugins add installs the skill pass
MCP server registered by the installer fail on caf0f6c, pass on 27ed4e3
OAuth 2.0 + PKCE consent → connected pass
initializeserverInfo.name == "mobbin" pass
tools/list → exactly search_screens, search_flows, search_sections pass
Prompt returns real results, every one cited with its mobbin_url pass
Skill auto-invokes without being named inconsistent — see below

The installer gap this PR works around

Agent Plugins 1.0.0 §7.2.1 puts MCP config at mcp.json. plugins@1.3.4 only ever probes the dot-prefixed .mcp.json (dist/index.js L103, L159, L1206-1207, L1384, L1823), so it installed the skill and silently dropped the server — no warning, and its summary line never mentions MCP either way:

$ claude mcp list          # after installing caf0f6c
(no plugin-scoped server)

27ed4e3 adds .mcp.json in the installer-native shape (type: "http", no $schema) alongside the spec file, plus a validator check that the two stay in sync:

$ npx -y plugins@1.3.4 add . -t claude-code -s user -y
mobbin-agent-plugin  1 skill, mcp

$ claude mcp list
plugin:mobbin-agent-plugin:mobbin: https://api.mobbin.com/mcp (HTTP) - ! Needs authentication

Notes for reviewers

  • Codex: the installer writes {"mcpServers": "./.mcp.json"} into the generated Codex manifest and copies the file into the plugin cache, but codex mcp list doesn't enumerate plugin-scoped servers, so Codex registration is unconfirmed either way. Claude Code is the confirmed path.
  • Skill invocation is only reliable when the skill is named in the prompt. A Mobbin-shaped question can go straight to the MCP tool without loading the skill, in which case its citation rule never applies. That's client behaviour, not something the package controls.
  • Free-tier access: the test account is free tier, and search_screens/search_flows returned full results even though the docs scope MCP to Pro/Team/Enterprise. Flagged separately for the server owners; no account was upgraded.
  • Two cosmetic upstream CLI bugs, not addressed here: the installer names the plugin after the repo directory rather than the manifest name, and writes version 0.0.0 instead of 0.1.0.
  • GitHub-shorthand installs (plugins add mobbin/mobbin-agent-plugin) clone the default branch, so the shorthand path in the README can only be verified after this merges.

claude code /mcp connected

cited mobbin results

demo

devin-ai-integration Bot and others added 4 commits August 7, 2026 06:15
Co-Authored-By: xingxiang <xingxiang@twotreesgroup.com>
Co-Authored-By: xingxiang <xingxiang@twotreesgroup.com>
Co-Authored-By: xingxiang <xingxiang@twotreesgroup.com>
Co-Authored-By: xingxiang <xingxiang@twotreesgroup.com>
@devin-ai-integration

devin-ai-integration Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

E2E test in VS Code — a spec-conformant client

Re-tested at 774b03a in VS Code 1.132.0, loading the package from a local checkout via chat.pluginLocations. Earlier results in this thread went through the plugins CLI and Claude Code; since the spec leaves installation to each client and Claude Code isn't on the compatible-clients list, those are superseded by this run.

Root mcp.json alone is enough, and the server surfaces as a clean mobbin

With no .mcp.json, no .claude-plugin/ and no .codex-plugin/ anywhere in the tree, VS Code lists exactly one server under the manifest name:

MCP: List Servers shows mobbin (Agent Plugin)

"Show Configuration" opens the repo's own root mcp.json — the client is reading the spec file, not a vendor shim:

Show Configuration opens root mcp.json

The plugin:mobbin:mobbin string seen earlier was a Claude Code naming artifact. A conformant client just shows mobbin.

OAuth, 3 tools, and a real search_sections call

Start Server produced a genuine OAuth 2.0 + PKCE flow (code_challenge, S256, resource=https://api.mobbin.com/mcp); after consent the server reached Running with Discovered 3 toolssearch_flows, search_screens, search_sections.

search_sections was then invoked for real from chat (first time in any test run — previously it was only ever seen in tools/list), returning 20 fintech pricing sections:

Ran Search Sections tool call with results

And the returned URLs resolve — the first result opens the exact Slash pricing section shown inline in chat:

Slash pricing section on mobbin.com

Full run

VS Code end-to-end run

Notes and gaps
  • Plan gating behaved correctly — the test account belongs to a team workspace, which was the workspace selected on the OAuth consent screen, so entitlement came from there. Worth knowing for future runs: the consent screen offers a workspace choice and that choice determines access.
  • No GitHub Copilot subscription is needed to use this in VS Code — a BYOK custom endpoint works fine. Possibly worth a README line.
  • Not tested: GitHub Copilot, ChatGPT/Codex, Kiro. search_screens/search_flows are present in the tool list but were not invoked in a conformant client. Cursor is in progress.

Co-Authored-By: xingxiang <xingxiang@twotreesgroup.com>
@kingstarfly
kingstarfly merged commit 8539d47 into main Aug 7, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant