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>
142 lines
8.0 KiB
Markdown
142 lines
8.0 KiB
Markdown
# Table of contents
|
|
|
|
* [AutoGPT Blocks Overview](README.md)
|
|
|
|
## Guides
|
|
|
|
* [LLM Providers](guides/llm-providers.md)
|
|
* [Voice Providers](guides/voice-providers.md)
|
|
|
|
## Block Integrations
|
|
|
|
* [Airtable Bases](block-integrations/airtable/bases.md)
|
|
* [Airtable Records](block-integrations/airtable/records.md)
|
|
* [Airtable Schema](block-integrations/airtable/schema.md)
|
|
* [Airtable Triggers](block-integrations/airtable/triggers.md)
|
|
* [Apollo Organization](block-integrations/apollo/organization.md)
|
|
* [Apollo People](block-integrations/apollo/people.md)
|
|
* [Apollo Person](block-integrations/apollo/person.md)
|
|
* [Ayrshare Post To Bluesky](block-integrations/ayrshare/post_to_bluesky.md)
|
|
* [Ayrshare Post To Facebook](block-integrations/ayrshare/post_to_facebook.md)
|
|
* [Ayrshare Post To GMB](block-integrations/ayrshare/post_to_gmb.md)
|
|
* [Ayrshare Post To Instagram](block-integrations/ayrshare/post_to_instagram.md)
|
|
* [Ayrshare Post To LinkedIn](block-integrations/ayrshare/post_to_linkedin.md)
|
|
* [Ayrshare Post To Pinterest](block-integrations/ayrshare/post_to_pinterest.md)
|
|
* [Ayrshare Post To Reddit](block-integrations/ayrshare/post_to_reddit.md)
|
|
* [Ayrshare Post To Snapchat](block-integrations/ayrshare/post_to_snapchat.md)
|
|
* [Ayrshare Post To Telegram](block-integrations/ayrshare/post_to_telegram.md)
|
|
* [Ayrshare Post To Threads](block-integrations/ayrshare/post_to_threads.md)
|
|
* [Ayrshare Post To TikTok](block-integrations/ayrshare/post_to_tiktok.md)
|
|
* [Ayrshare Post To X](block-integrations/ayrshare/post_to_x.md)
|
|
* [Ayrshare Post To YouTube](block-integrations/ayrshare/post_to_youtube.md)
|
|
* [Baas Bots](block-integrations/baas/bots.md)
|
|
* [Bannerbear Text Overlay](block-integrations/bannerbear/text_overlay.md)
|
|
* [Basic](block-integrations/basic.md)
|
|
* [Compass Triggers](block-integrations/compass/triggers.md)
|
|
* [Data](block-integrations/data.md)
|
|
* [Dataforseo Keyword Suggestions](block-integrations/dataforseo/keyword_suggestions.md)
|
|
* [Dataforseo Related Keywords](block-integrations/dataforseo/related_keywords.md)
|
|
* [Discord Bot Blocks](block-integrations/discord/bot_blocks.md)
|
|
* [Discord OAuth Blocks](block-integrations/discord/oauth_blocks.md)
|
|
* [Enrichlayer LinkedIn](block-integrations/enrichlayer/linkedin.md)
|
|
* [Exa Answers](block-integrations/exa/answers.md)
|
|
* [Exa Code Context](block-integrations/exa/code_context.md)
|
|
* [Exa Contents](block-integrations/exa/contents.md)
|
|
* [Exa Research](block-integrations/exa/research.md)
|
|
* [Exa Search](block-integrations/exa/search.md)
|
|
* [Exa Similar](block-integrations/exa/similar.md)
|
|
* [Exa Webhook Blocks](block-integrations/exa/webhook_blocks.md)
|
|
* [Exa Websets](block-integrations/exa/websets.md)
|
|
* [Exa Websets Enrichment](block-integrations/exa/websets_enrichment.md)
|
|
* [Exa Websets Import Export](block-integrations/exa/websets_import_export.md)
|
|
* [Exa Websets Items](block-integrations/exa/websets_items.md)
|
|
* [Exa Websets Monitor](block-integrations/exa/websets_monitor.md)
|
|
* [Exa Websets Polling](block-integrations/exa/websets_polling.md)
|
|
* [Exa Websets Search](block-integrations/exa/websets_search.md)
|
|
* [Fal AI Video Generator](block-integrations/fal/ai_video_generator.md)
|
|
* [Firecrawl Crawl](block-integrations/firecrawl/crawl.md)
|
|
* [Firecrawl Extract](block-integrations/firecrawl/extract.md)
|
|
* [Firecrawl Map](block-integrations/firecrawl/map.md)
|
|
* [Firecrawl Scrape](block-integrations/firecrawl/scrape.md)
|
|
* [Firecrawl Search](block-integrations/firecrawl/search.md)
|
|
* [Generic Webhook Triggers](block-integrations/generic_webhook/triggers.md)
|
|
* [GitHub Checks](block-integrations/github/checks.md)
|
|
* [GitHub CI](block-integrations/github/ci.md)
|
|
* [GitHub Issues](block-integrations/github/issues.md)
|
|
* [GitHub Pull Requests](block-integrations/github/pull_requests.md)
|
|
* [GitHub Repo](block-integrations/github/repo.md)
|
|
* [GitHub Reviews](block-integrations/github/reviews.md)
|
|
* [GitHub Statuses](block-integrations/github/statuses.md)
|
|
* [GitHub Triggers](block-integrations/github/triggers.md)
|
|
* [Google Calendar](block-integrations/google/calendar.md)
|
|
* [Google Docs](block-integrations/google/docs.md)
|
|
* [Google Gmail](block-integrations/google/gmail.md)
|
|
* [Google Sheets](block-integrations/google/sheets.md)
|
|
* [HubSpot Company](block-integrations/hubspot/company.md)
|
|
* [HubSpot Contact](block-integrations/hubspot/contact.md)
|
|
* [HubSpot Engagement](block-integrations/hubspot/engagement.md)
|
|
* [Jina Chunking](block-integrations/jina/chunking.md)
|
|
* [Jina Embeddings](block-integrations/jina/embeddings.md)
|
|
* [Jina Fact Checker](block-integrations/jina/fact_checker.md)
|
|
* [Jina Search](block-integrations/jina/search.md)
|
|
* [Linear Comment](block-integrations/linear/comment.md)
|
|
* [Linear Issues](block-integrations/linear/issues.md)
|
|
* [Linear Projects](block-integrations/linear/projects.md)
|
|
* [LLM](block-integrations/llm.md)
|
|
* [Logic](block-integrations/logic.md)
|
|
* [Mcp Block](block-integrations/mcp/block.md)
|
|
* [Misc](block-integrations/misc.md)
|
|
* [Notion Create Page](block-integrations/notion/create_page.md)
|
|
* [Notion Read Database](block-integrations/notion/read_database.md)
|
|
* [Notion Read Page](block-integrations/notion/read_page.md)
|
|
* [Notion Read Page Markdown](block-integrations/notion/read_page_markdown.md)
|
|
* [Notion Search](block-integrations/notion/search.md)
|
|
* [Nvidia Deepfake](block-integrations/nvidia/deepfake.md)
|
|
* [Replicate Flux Advanced](block-integrations/replicate/flux_advanced.md)
|
|
* [Replicate Replicate Block](block-integrations/replicate/replicate_block.md)
|
|
* [Search](block-integrations/search.md)
|
|
* [Slant3D Filament](block-integrations/slant3d/filament.md)
|
|
* [Slant3D Order](block-integrations/slant3d/order.md)
|
|
* [Slant3D Slicing](block-integrations/slant3d/slicing.md)
|
|
* [Slant3D Webhook](block-integrations/slant3d/webhook.md)
|
|
* [Smartlead Campaign](block-integrations/smartlead/campaign.md)
|
|
* [Stagehand Blocks](block-integrations/stagehand/blocks.md)
|
|
* [System Library Operations](block-integrations/system/library_operations.md)
|
|
* [System Store Operations](block-integrations/system/store_operations.md)
|
|
* [Text](block-integrations/text.md)
|
|
* [Todoist Comments](block-integrations/todoist/comments.md)
|
|
* [Todoist Labels](block-integrations/todoist/labels.md)
|
|
* [Todoist Projects](block-integrations/todoist/projects.md)
|
|
* [Todoist Sections](block-integrations/todoist/sections.md)
|
|
* [Todoist Tasks](block-integrations/todoist/tasks.md)
|
|
* [Twitter Blocks](block-integrations/twitter/blocks.md)
|
|
* [Twitter Bookmark](block-integrations/twitter/bookmark.md)
|
|
* [Twitter Follows](block-integrations/twitter/follows.md)
|
|
* [Twitter Hide](block-integrations/twitter/hide.md)
|
|
* [Twitter Like](block-integrations/twitter/like.md)
|
|
* [Twitter List Follows](block-integrations/twitter/list_follows.md)
|
|
* [Twitter List Lookup](block-integrations/twitter/list_lookup.md)
|
|
* [Twitter List Members](block-integrations/twitter/list_members.md)
|
|
* [Twitter List Tweets Lookup](block-integrations/twitter/list_tweets_lookup.md)
|
|
* [Twitter Manage](block-integrations/twitter/manage.md)
|
|
* [Twitter Manage Lists](block-integrations/twitter/manage_lists.md)
|
|
* [Twitter Mutes](block-integrations/twitter/mutes.md)
|
|
* [Twitter Pinned Lists](block-integrations/twitter/pinned_lists.md)
|
|
* [Twitter Quote](block-integrations/twitter/quote.md)
|
|
* [Twitter Retweet](block-integrations/twitter/retweet.md)
|
|
* [Twitter Search Spaces](block-integrations/twitter/search_spaces.md)
|
|
* [Twitter Spaces Lookup](block-integrations/twitter/spaces_lookup.md)
|
|
* [Twitter Timeline](block-integrations/twitter/timeline.md)
|
|
* [Twitter Tweet Lookup](block-integrations/twitter/tweet_lookup.md)
|
|
* [Twitter User Lookup](block-integrations/twitter/user_lookup.md)
|
|
* [Video Add Audio](block-integrations/video/add_audio.md)
|
|
* [Video Clip](block-integrations/video/clip.md)
|
|
* [Video Concat](block-integrations/video/concat.md)
|
|
* [Video Download](block-integrations/video/download.md)
|
|
* [Video Duration](block-integrations/video/duration.md)
|
|
* [Video Loop](block-integrations/video/loop.md)
|
|
* [Video Narration](block-integrations/video/narration.md)
|
|
* [Video Text Overlay](block-integrations/video/text_overlay.md)
|
|
* [Wolfram LLM API](block-integrations/wolfram/llm_api.md)
|
|
* [Zerobounce Validate Emails](block-integrations/zerobounce/validate_emails.md)
|