mirror of
https://github.com/Significant-Gravitas/AutoGPT.git
synced 2026-02-14 00:35:02 -05:00
## Summary <img width="1000" alt="image" src="https://github.com/user-attachments/assets/18e8ef34-d222-453c-8b0a-1b25ef8cf806" /> <img width="250" alt="image" src="https://github.com/user-attachments/assets/ba97556c-09c5-4f76-9f4e-49a2e8e57468" /> <img width="250" alt="image" src="https://github.com/user-attachments/assets/68f7804a-fe74-442d-9849-39a229c052cf" /> <img width="250" alt="image" src="https://github.com/user-attachments/assets/700690ba-f9fe-4726-8871-3bfbab586001" /> Full-stack MCP (Model Context Protocol) tool block integration that allows users to connect to any MCP server, discover available tools, authenticate via OAuth, and execute tools — all through the standard AutoGPT credential system. ### Backend - **MCPToolBlock** (`blocks/mcp/block.py`): New block using `CredentialsMetaInput` pattern with optional credentials (`default={}`), supporting both authenticated (OAuth) and public MCP servers. Includes auto-lookup fallback for backward compatibility. - **MCP Client** (`blocks/mcp/client.py`): HTTP transport with JSON-RPC 2.0, tool discovery, tool execution with robust error handling (type-checked error fields, non-JSON response handling) - **MCP OAuth Handler** (`blocks/mcp/oauth.py`): RFC 8414 discovery, dynamic per-server OAuth with PKCE, token storage and refresh via `raise_for_status=True` - **MCP API Routes** (`api/features/mcp/routes.py`): `discover-tools`, `oauth/login`, `oauth/callback` endpoints with credential cleanup, defensive OAuth metadata validation - **Credential system integration**: - `CredentialsMetaInput` model_validator normalizes legacy `"ProviderName.MCP"` format from Python 3.13's `str(StrEnum)` change - `CredentialsFieldInfo.combine()` supports URL-based credential discrimination (each MCP server gets its own credential entry) - `aggregate_credentials_inputs` checks block schema defaults for credential optionality - Executor normalizes credential data for both Pydantic and JSON schema validation paths - Chat credential matching handles MCP server URL filtering - `provider_matches()` helper used consistently for Python 3.13 StrEnum compatibility - **Pre-run validation**: `_validate_graph_get_errors` now calls `get_missing_input()` for custom block-level validation (MCP tool arguments) - **Security**: HTML tag stripping loop to prevent XSS bypass, SSRF protection (removed trusted_origins) ### Frontend - **MCPToolDialog** (`MCPToolDialog.tsx`): Full tool discovery UI — enter server URL, authenticate if needed, browse tools, select tool and configure - **OAuth popup** (`oauth-popup.ts`): Shared utility supporting cross-origin MCP OAuth flows with BroadcastChannel + localStorage fallback - **Credential integration**: MCP-specific OAuth flow in `useCredentialsInput`, server URL filtering in `useCredentials`, MCP callback page - **CredentialsSelect**: Auto-selects first available credential instead of defaulting to "None", credentials listed before "None" in dropdown - **Node rendering**: Dynamic tool input schema rendering on MCP nodes, proper handling in both legacy and new flow editors - **Block title persistence**: `customized_name` set at block creation for both MCP and Agent blocks — no fallback logic needed, titles survive save/load reliably - **Stable credential ordering**: Removed `sortByUnsetFirst` that caused credential inputs to jump when selected ### Tests (~2060 lines) - Unit tests: block, client, tool execution - Integration tests: mock MCP server with auth - OAuth flow tests - API endpoint tests - Credential combining/optionality tests - E2e tests (skipped in CI, run manually) ## Key Design Decisions 1. **Optional credentials via `default={}`**: MCP servers can be public (no auth) or private (OAuth). The `credentials` field has `default={}` making it optional at the schema level, so public servers work without prompting for credentials. 2. **URL-based credential discrimination**: Each MCP server URL gets its own credential entry in the "Run agent" form (via `discriminator="server_url"`), so agents using multiple MCP servers prompt for each independently. 3. **Model-level normalization**: Python 3.13 changed `str(StrEnum)` to return `"ClassName.MEMBER"`. Rather than scattering fixes across the codebase, a Pydantic `model_validator(mode="before")` on `CredentialsMetaInput` handles normalization centrally, and `provider_matches()` handles lookups. 4. **Credential auto-select**: `CredentialsSelect` component defaults to the first available credential and notifies the parent state, ensuring credentials are pre-filled in the "Run agent" dialog without requiring manual selection. 5. **customized_name for block titles**: Both MCP and Agent blocks set `customized_name` in metadata at creation time. This eliminates convoluted runtime fallback logic (`agent_name`, hostname extraction) — the title is persisted once and read directly. ## Test plan - [x] Unit/integration tests pass (68 MCP + 11 graph = 79 tests) - [x] Manual: MCP block with public server (DeepWiki) — no credentials needed, tools discovered and executable - [x] Manual: MCP block with OAuth server (Linear, Sentry) — OAuth flow prompts correctly - [x] Manual: "Run agent" form shows correct credential requirements per MCP server - [x] Manual: Credential auto-selects when exactly one matches, pre-selects first when multiple exist - [x] Manual: Credential ordering stays stable when selecting/deselecting - [x] Manual: MCP block title persists after save and refresh - [x] Manual: Agent block title persists after save and refresh (via customized_name) - [ ] Manual: Shared agent with MCP block prompts new user for credentials --------- Co-authored-by: Otto <otto@agpt.co> Co-authored-by: Ubbe <hi@ubbe.dev>
8.0 KiB
8.0 KiB
Table of contents
Guides
Block Integrations
- Airtable Bases
- Airtable Records
- Airtable Schema
- Airtable Triggers
- Apollo Organization
- Apollo People
- Apollo Person
- Ayrshare Post To Bluesky
- Ayrshare Post To Facebook
- Ayrshare Post To GMB
- Ayrshare Post To Instagram
- Ayrshare Post To LinkedIn
- Ayrshare Post To Pinterest
- Ayrshare Post To Reddit
- Ayrshare Post To Snapchat
- Ayrshare Post To Telegram
- Ayrshare Post To Threads
- Ayrshare Post To TikTok
- Ayrshare Post To X
- Ayrshare Post To YouTube
- Baas Bots
- Bannerbear Text Overlay
- Basic
- Compass Triggers
- Data
- Dataforseo Keyword Suggestions
- Dataforseo Related Keywords
- Discord Bot Blocks
- Discord OAuth Blocks
- Enrichlayer LinkedIn
- Exa Answers
- Exa Code Context
- Exa Contents
- Exa Research
- Exa Search
- Exa Similar
- Exa Webhook Blocks
- Exa Websets
- Exa Websets Enrichment
- Exa Websets Import Export
- Exa Websets Items
- Exa Websets Monitor
- Exa Websets Polling
- Exa Websets Search
- Fal AI Video Generator
- Firecrawl Crawl
- Firecrawl Extract
- Firecrawl Map
- Firecrawl Scrape
- Firecrawl Search
- Generic Webhook Triggers
- GitHub Checks
- GitHub CI
- GitHub Issues
- GitHub Pull Requests
- GitHub Repo
- GitHub Reviews
- GitHub Statuses
- GitHub Triggers
- Google Calendar
- Google Docs
- Google Gmail
- Google Sheets
- HubSpot Company
- HubSpot Contact
- HubSpot Engagement
- Jina Chunking
- Jina Embeddings
- Jina Fact Checker
- Jina Search
- Linear Comment
- Linear Issues
- Linear Projects
- LLM
- Logic
- Mcp Block
- Misc
- Notion Create Page
- Notion Read Database
- Notion Read Page
- Notion Read Page Markdown
- Notion Search
- Nvidia Deepfake
- Replicate Flux Advanced
- Replicate Replicate Block
- Search
- Slant3D Filament
- Slant3D Order
- Slant3D Slicing
- Slant3D Webhook
- Smartlead Campaign
- Stagehand Blocks
- System Library Operations
- System Store Operations
- Text
- Todoist Comments
- Todoist Labels
- Todoist Projects
- Todoist Sections
- Todoist Tasks
- Twitter Blocks
- Twitter Bookmark
- Twitter Follows
- Twitter Hide
- Twitter Like
- Twitter List Follows
- Twitter List Lookup
- Twitter List Members
- Twitter List Tweets Lookup
- Twitter Manage
- Twitter Manage Lists
- Twitter Mutes
- Twitter Pinned Lists
- Twitter Quote
- Twitter Retweet
- Twitter Search Spaces
- Twitter Spaces Lookup
- Twitter Timeline
- Twitter Tweet Lookup
- Twitter User Lookup
- Video Add Audio
- Video Clip
- Video Concat
- Video Download
- Video Duration
- Video Loop
- Video Narration
- Video Text Overlay
- Wolfram LLM API
- Zerobounce Validate Emails