Skip to content

Minimal MCP server for AI agent integration - #2298

Closed
jeremy wants to merge 4 commits into
oauthfrom
mini-mcp
Closed

Minimal MCP server for AI agent integration#2298
jeremy wants to merge 4 commits into
oauthfrom
mini-mcp

Conversation

@jeremy

@jeremy jeremy commented Jan 6, 2026

Copy link
Copy Markdown
Member

Use Fizzy from your favorite LLM. Even use Fizzy as a coordination bus for your agents, workflows, and skills. Fluent, fast, no bloat.

This is a simple, purposefully bare-bones trial-balloon implementation with no new abstractions or modeling. (Rails' take on MCP should elegantly satisfy what we're after here, but this isn't the PR for it.)

Model Context Protocol 2025-06-18 with streamable HTTP. Resource responses are concise to limit token bloat and keep context window creep under control.

Endpoints:

  • GET /.well-known/mcp.json - Discovery with OAuth server reference
  • POST /mcp - JSON-RPC requests with bearer token authentication

Tools (create_board, create_card, update_card, move_card) for workspace management. Resources for reading accounts, boards, and cards via fizzy:// URI scheme.

Builds on OAuth 2.1 support for seamless authentication: #2296

fizzy mcp in dev fizzy mcp tools fizzy mcp move_card tool
> Give the Fizzy MCP a spin and show it off a little. 

⏺ fizzy-dev - create_board (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", name: "Claude Code Integration", columns:
                                ["Backlog","Up Next","In Progress","Done"])
  ⎿  {                                                                                                             
       "id": "03fcova6uufz7y62j61w6h182",
       "name": "Claude Code Integration",
     … +8 lines (ctrl+o to expand)

⏺ fizzy-dev - create_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", board: "Claude Code Integration", title: "OAuth
                               2.1 with PKCE", description: "Dynamic client registration, authorization code flow, token
                                exchange")
  ⎿  {                                                                                                             
       "number": 17,
       "title": "OAuth 2.1 with PKCE",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - create_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", board: "Claude Code Integration", title: "MCP HTTP
                                transport", description: "JSON-RPC 2.0 over Streamable HTTP with bearer token auth")
  ⎿  {                                                                                                             
       "number": 18,
       "title": "MCP HTTP transport",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - create_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", board: "Claude Code Integration", title: "Tools
                               and Resources", description: "create_board, create_card, update_card, move_card +
                               fizzy:// resources")
  ⎿  {                                                                                                             
       "number": 19,
       "title": "Tools and Resources",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - create_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", board: "Claude Code Integration", title:
                               "Production deployment")
  ⎿  {                                                                                                             
       "number": 20,
       "title": "Production deployment",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - move_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", card: "17", to: "done")
  ⎿  {                                                                                                             
       "number": 17,
       "title": "OAuth 2.1 with PKCE",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - move_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", card: "18", to: "done")
  ⎿  {                                                                                                             
       "number": 18,
       "title": "MCP HTTP transport",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - move_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", card: "19", to: "done")
  ⎿  {                                                                                                             
       "number": 19,
       "title": "Tools and Resources",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - update_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", card: "19", comment: "Shipped! 🚢 This card was
                               created, moved, and commented on entirely via MCP.")
  ⎿  {                                                                                                             
       "number": 19,
       "title": "Tools and Resources",
     … +4 lines (ctrl+o to expand)

⏺ fizzy-dev - move_card (MCP)(account: "03f6treajp9yfa7z2cdgufkf9", card: "20", to: "Up Next")
  ⎿  {                                                                                                             
       "number": 20,
       "title": "Production deployment",
     … +4 lines (ctrl+o to expand)

⏺ readMcpResource(Read resource "fizzy://accounts/03f6treajp9yfa7z2cdgufkf9/boards/03fcova6uufz7y62j61w6h182" from
                 server "fizzy-dev")
  ⎿  {                             
       "contents": [
         {
     … +14 lines (ctrl+o to expand)

⏺ Claude Code Integration board:

  | Backlog | Up Next                   | In Progress | Done                    |
  |---------|---------------------------|-------------|-------------------------|
  |         | #20 Production deployment |             | #17 OAuth 2.1 with PKCE |
  |         |                           |             | #18 MCP HTTP transport  |
  |         |                           |             | #19 Tools and Resources |

  Three shipped, one queued up. All managed from here via MCP.

@chansantheman

Copy link
Copy Markdown

Very cool

- OAuth tokens = Access Token that belongs to an OAuth client
- One table (oauth_clients) + one column (oauth_client_id)
- Stateless authorization codes via MessageEncryptor (60s TTL)
- Implicit grants (token exists = grant, revoke = delete tokens)
- Dynamic client registration for MCPs
- Token lifetime: no expiry, explicit revocation only
- Scope mapping: space-delimited OAuth scopes → permission enum
- Security: PKCE required, loopback-only DCR, rate limiting
- RFC compliance: 6749, 6750, 7636, 7591, 8252, 8414, 9728

Authorization flow with PKCE (S256 only)
- Consent screen showing client name and requested scopes
- Stateless authorization codes via MessageEncryptor

Token endpoint
- Authorization code exchange with PKCE verification
- Issues Identity::AccessToken linked to OAuth client

Revocation endpoint (RFC 7009)
- Revoke access tokens by value
- Always returns 200 per spec
Discovery endpoints (RFC 8414):
- /.well-known/oauth-authorization-server
- /.well-known/oauth-protected-resource

Dynamic Client Registration (RFC 7591):
- POST /oauth/clients for MCP clients
- Loopback redirects only (127.0.0.1, localhost, [::1])
- Rate limited to 10 requests/minute
View and revoke OAuth client access at /my/connected_apps.
Scoped through identity's OAuth tokens for proper authorization.
Links from access tokens index for discoverability.
Use Fizzy from your favorite LLM. Even use Fizzy as a coordination bus
for your agents, workflows, and skills. Fluent, fast, no bloat.

Simple, purposefully bare-bones trial-balloon implementation with no new
abstractions or modeling. (Rails' take on MCP should elegantly satisfy what
we're after here, but this isn't the PR for it.)

Model Context Protocol 2025-06-18 with streamable HTTP. Resource responses
are concise to limit token bloat and keep context window creep under control.

Endpoints:
- GET /.well-known/mcp.json - Discovery with OAuth server reference
- POST /mcp - JSON-RPC requests with bearer token authentication

Tools (create_board, create_card, update_card, move_card) for
workspace management. Resources for reading accounts, boards,
and cards via fizzy:// URI scheme.

Builds on OAuth 2.1 support for seamless authentication.
@jason-engage

Copy link
Copy Markdown

Is this going to get merged in soon? Any expected timeframe?

@jeremy

jeremy commented Jan 23, 2026

Copy link
Copy Markdown
Member Author

Is this going to get merged in soon? Any expected timeframe?

MCPs eat a ton of context and don't integrate cleanly with RESTful APIs. But LLMs are great at operating CLI tooling! So for coding assistants, most folks are moving to skills and CLIs over MCPs: #2358

(@robzolkos has a great Fizzy CLI and skill you can use today.)

However, for non-CLI and non-local LLM integration, MCP remains the only option. We're weighing whether it's worth the clunky RPC layer before committing to it.

@adriantaut

Copy link
Copy Markdown

hey @jeremy

I just synced upstream with our fork and was looking at this (again 😄).

At ZAR we use fizzy, and we did add similar boilerplate . under load we had hiccups and connection drop. Then we found ActionMCP which the author helped implement in our apps.

I would be happy to copy our local code to align fizzy codebase, so we don't have to keep managing the divergence and open a clean PR instead.

@jeremy

jeremy commented Aug 28, 2026

Copy link
Copy Markdown
Member Author

Pursuing this outside of the main Fizzy app. Stay tuned.

@jeremy jeremy closed this Aug 28, 2026
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.

4 participants