From 0a7bfc439a3ffa797af06b81630cd832fcdb616d Mon Sep 17 00:00:00 2001 From: Kye Gomez Date: Mon, 21 Sep 2026 10:53:56 -0400 Subject: [PATCH] feat(swarms): add Swarms third-party MCP plugin Packages Swarms' hosted remote MCP server (https://mcp.swarms.world/mcp, Streamable HTTP) as a Cursor plugin. Exposes 23 tools covering agent and swarm completions, graph and batched-grid workflows, reasoning agents, the auto agent builder, batch processing, models, and account monitoring. Auth is a user-supplied Swarms API key sent as an `x-api-key` header, so the credential stays on the transport and is never a tool argument. Co-Authored-By: Claude Opus 5 (1M context) --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + third_party/swarms/.cursor-plugin/plugin.json | 51 ++++++++++++ third_party/swarms/CHANGELOG.md | 9 +++ third_party/swarms/LICENSE | 21 +++++ third_party/swarms/README.md | 75 ++++++++++++++++++ third_party/swarms/assets/logo.png | Bin 0 -> 12590 bytes third_party/swarms/mcp.json | 11 +++ 8 files changed, 173 insertions(+) create mode 100644 third_party/swarms/.cursor-plugin/plugin.json create mode 100644 third_party/swarms/CHANGELOG.md create mode 100644 third_party/swarms/LICENSE create mode 100644 third_party/swarms/README.md create mode 100644 third_party/swarms/assets/logo.png create mode 100644 third_party/swarms/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index ed6afb06d..66f19c5f3 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -412,6 +412,11 @@ "name": "statsig", "source": "third_party/statsig", "description": "Inspect and manage feature gates, experiments, dynamic configs, and metrics." + }, + { + "name": "swarms", + "source": "third_party/swarms", + "description": "Run agents, orchestrate multi-agent swarms, and process batches." } ] } diff --git a/README.md b/README.md index 21772a15f..0274e512b 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `excalidraw` | [Excalidraw](third_party/excalidraw/) | Cursor | Integrations | Draw and export hand-drawn diagrams from chat. | | `google-cloud-bigquery` | [Google Cloud BigQuery](third_party/google-cloud-bigquery/) | Cursor | Integrations | Explore datasets and tables and run SQL queries. | | `statsig` | [Statsig](third_party/statsig/) | Cursor | Integrations | Inspect and manage feature gates, experiments, dynamic configs, and metrics. | +| `swarms` | [Swarms](third_party/swarms/) | Cursor | Integrations | Run agents, orchestrate multi-agent swarms, and process batches. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/third_party/swarms/.cursor-plugin/plugin.json b/third_party/swarms/.cursor-plugin/plugin.json new file mode 100644 index 000000000..6650325b4 --- /dev/null +++ b/third_party/swarms/.cursor-plugin/plugin.json @@ -0,0 +1,51 @@ +{ + "name": "swarms", + "displayName": "Swarms", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Run agents, orchestrate multi-agent swarms, and process batches.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://docs.swarms.ai/docs/documentation/clients/swarms-api-mcp", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "swarms", + "agents", + "multi-agent", + "orchestration", + "swarm", + "workflows", + "batch processing", + "reasoning", + "llm", + "mcp" + ], + "category": "integrations", + "tags": [ + "swarms", + "agents", + "multi-agent", + "orchestration", + "mcp" + ], + "variables": { + "type": "object", + "properties": { + "SWARMS_API_KEY": { + "type": "string", + "title": "Swarms API key", + "description": "API key from https://swarms.world/platform/api-keys." + } + }, + "required": [ + "SWARMS_API_KEY" + ] + }, + "mcpServers": "./mcp.json" +} diff --git a/third_party/swarms/CHANGELOG.md b/third_party/swarms/CHANGELOG.md new file mode 100644 index 000000000..9fbf423d9 --- /dev/null +++ b/third_party/swarms/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `swarms` MCP server pointing at Swarms' hosted Streamable HTTP endpoint (`https://mcp.swarms.world/mcp`), exposing 23 tools across agents, swarms, specialized workflows, models, and account monitoring. +- Auth uses a Swarms API key supplied by the user as an `x-api-key` header (`${SWARMS_API_KEY}`). +- Logo: Swarms' official mark, from the `The-Swarm-Corporation` GitHub organization. diff --git a/third_party/swarms/LICENSE b/third_party/swarms/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/swarms/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Cursor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/swarms/README.md b/third_party/swarms/README.md new file mode 100644 index 000000000..93a8143e6 --- /dev/null +++ b/third_party/swarms/README.md @@ -0,0 +1,75 @@ +# Swarms + +Cursor plugin that connects agents to the [Swarms API](https://swarms.ai) through Swarms' official hosted remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Run a single agent, orchestrate a multi-agent swarm across 14 architectures, execute graph and batched-grid workflows, generate an agent roster from a plain-language task, and fan work out in parallel batches — all from chat. + +Official Cursor setup: https://docs.swarms.ai/docs/documentation/clients/swarms-api-mcp + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Swarms**. +3. Click **Install**, then set your Swarms API key (below). + +Or run `/add-plugin swarms` in chat. + +## MCP + +```json +{ + "mcpServers": { + "swarms": { + "type": "http", + "url": "https://mcp.swarms.world/mcp", + "headers": { + "x-api-key": "${SWARMS_API_KEY}" + } + } + } +} +``` + +Auth is a Swarms **API key** sent in an `x-api-key` header. Create one at https://swarms.world/platform/api-keys, then set it in **Dashboard → Plugins → Configure**. Do not commit the key. + +## Before you connect + +You need a Swarms account and an API key with credits. The server holds no key of its own — it forwards the key on each request to `https://api.swarms.world`, so every call runs against your account and spends your credits. The key travels as a transport header and is never a tool argument, so the model driving the tools never sees it. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Agents | Execute a single agent completion with a full agent spec (model, system prompt, loops, tools, images), run many agent completions in parallel, and list agent configurations you have created | +| Swarms | Execute a multi-agent swarm over `SequentialWorkflow`, `ConcurrentWorkflow`, `HierarchicalSwarm`, `MixtureOfAgents`, `GroupChat`, `MajorityVoting`, `AgentRearrange`, `MultiAgentRouter`, `CouncilAsAJudge`, `LLMCouncil`, `DebateWithJudge`, `HeavySwarm`, `RoundRobin`, or `PlannerWorkerSwarm`; run swarms in parallel batches; list available architectures | +| Specialized workflows | Graph workflows with directed agent nodes and edges, batched grid workflows, reasoning agents with their type list, and an auto agent builder that designs a roster from a task description | +| Models and tools | List available models, list models in OpenAI-compatible shape, OpenAI-compatible chat completions, and list available API tools | +| Account and monitoring | Rate limits and usage, credit balance, pricing details, metrics summary, request logs, premium endpoint availability, and health | + +23 tools in total. The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Tool calls run with the permissions and credits attached to the API key, and are billed the same way the REST API is. Check `credit_balance_v1_account_credits_get` and `usage_costs_v1_usage_costs_get` before long runs. +- Swarm and batch runs can be long and expensive — a swarm accepts up to 2000 agents and 50 loops. Confirm the shape of the run before launching one from chat. +- Some endpoints, including batched grid workflows, are premium-only. `premium_endpoints_v1_account_premium_endpoints_get` returns the current list. +- `tools/list` works without a key, so the tool surface is discoverable before you authenticate; only tool calls need credentials. +- Two tool names are truncated with a stable hash suffix (`..._comple_a8b363`, `..._comple_0dda3b`) because MCP caps tool-name length. Use them exactly as the runtime lists them. +- Tool results carry `structuredContent` alongside the text rendering, so results parse without string handling. Upstream failures come back as `isError: true`, not transport exceptions. +- Revoke access at any time by deleting the key from the Swarms API keys page. + +## Docs + +- Swarms API MCP server: https://docs.swarms.ai/docs/documentation/clients/swarms-api-mcp +- Documentation home: https://docs.swarms.ai +- Quickstart: https://docs.swarms.ai/docs/documentation/getting-started/quickstart +- Multi-agent architectures: https://docs.swarms.ai/docs/documentation/multi-agent/available-architectures +- Pricing and rate limits: https://docs.swarms.ai/docs/documentation/resources/pricing +- API keys: https://swarms.world/platform/api-keys +- Server URL: https://mcp.swarms.world/mcp + +Logo is Swarms' official mark, from the `The-Swarm-Corporation` GitHub organization. + +## License + +MIT diff --git a/third_party/swarms/assets/logo.png b/third_party/swarms/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..016d85b7412b226a9da53b96dec955f9bf9352ee GIT binary patch literal 12590 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 Gg8v6`