Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Each release ships with a structured changelog covering fixes, new features, bre

- [Latest release](https://github.com/HelpCode-ai/anythingmcp/releases/latest)
- [All releases](https://github.com/HelpCode-ai/anythingmcp/releases)
- [Roadmap](ROADMAP.md)
- [Roadmap](docs/ROADMAP.md)

## Versioning

Expand Down
2 changes: 1 addition & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ abstract: >
server that turns REST/OpenAPI, SOAP/WSDL and GraphQL APIs, SQL/NoSQL
databases and other MCP servers into tools for AI clients such as Claude,
ChatGPT, Google Gemini, GitHub Copilot and Cursor, without writing code.
It ships 265 pre-built adapters, with a focus on ERP and e-commerce
It ships 266 pre-built adapters, with a focus on ERP and e-commerce
systems (SAP Business One, Odoo, Xentral, JTL-Wawi, weclapp, Shopware,
WooCommerce, Amazon Seller, Kaufland, OTTO, etc.), a per-workspace
knowledge graph served over MCP, per-tool response mapping,
Expand Down
6 changes: 3 additions & 3 deletions README.de.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.de.png" alt="AnythingMCP macht ERP-, E-Commerce-, REST-, SOAP- und SQL-Systeme zu MCP-Tools für Claude und ChatGPT: 265 Connectors, 21 davon ohne API-Schlüssel." width="100%" />
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.de.png" alt="AnythingMCP macht ERP-, E-Commerce-, REST-, SOAP- und SQL-Systeme zu MCP-Tools für Claude und ChatGPT: 266 Connectors, 21 davon ohne API-Schlüssel." width="100%" />
</p>

<h1 align="center">AnythingMCP: selbst gehostetes MCP-Gateway</h1>
Expand All @@ -19,7 +19,7 @@

<p align="center">
<strong>AnythingMCP ist ein quelloffenes, selbst gehostetes MCP-Gateway, das jedes REST-/OpenAPI-, SOAP-, GraphQL-, OData- oder SQL-System in MCP-Tools für Claude, ChatGPT und Copilot verwandelt, ohne dass du einen MCP-Server programmierst.</strong><br/>
Es bringt 265 fertige Adapter mit, darunter SAP, Etsy, weclapp und Amazon Seller; 21 davon kommen ohne API-Schlüssel aus.
Es bringt 266 fertige Adapter mit, darunter SAP, Etsy, weclapp und Amazon Seller; 21 davon kommen ohne API-Schlüssel aus.
</p>

<p align="center">
Expand Down Expand Up @@ -111,7 +111,7 @@ Tools werden zur Laufzeit registriert, ohne Neustart. `{{VAR}}`-Werte pro Connec

## Connector-Katalog

265 Adapter mit über 2.400 Tools. Zu jedem gibt es eine Einrichtungsanleitung auf [anythingmcp.com/de/guides](https://anythingmcp.com/de/guides), in sieben Sprachen.
266 Adapter mit über 2.400 Tools. Zu jedem gibt es eine Einrichtungsanleitung auf [anythingmcp.com/de/guides](https://anythingmcp.com/de/guides), in sieben Sprachen.

| Kategorie | Beispiele |
|---|---|
Expand Down
6 changes: 3 additions & 3 deletions README.ja.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.ja.png" alt="AnythingMCP は ERP、E コマース、REST、SOAP、SQL の各システムを Claude と ChatGPT 用の MCP ツールに変換します。265 のコネクター、うち 21 は API キー不要。" width="100%" />
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.ja.png" alt="AnythingMCP は ERP、E コマース、REST、SOAP、SQL の各システムを Claude と ChatGPT 用の MCP ツールに変換します。266 のコネクター、うち 21 は API キー不要。" width="100%" />
</p>

<h1 align="center">AnythingMCP:セルフホスト型 MCP ゲートウェイ</h1>
Expand All @@ -19,7 +19,7 @@

<p align="center">
<strong>AnythingMCP は、オープンソースのセルフホスト型 MCP ゲートウェイです。MCP サーバーを書かずに、REST/OpenAPI、SOAP、GraphQL、OData、SQL のあらゆるシステムを Claude、ChatGPT、Copilot 用の MCP ツールに変換します。</strong><br/>
SAP、Etsy、weclapp、Amazon Seller などを含む 265 種類の既製アダプターを同梱しており、うち 21 は API キー不要です。
SAP、Etsy、weclapp、Amazon Seller などを含む 266 種類の既製アダプターを同梱しており、うち 21 は API キー不要です。
</p>

<p align="center">
Expand Down Expand Up @@ -111,7 +111,7 @@ amd64 ではイメージの取得に約 30 秒、その 24 秒後に API が利

## コネクターカタログ

265 個のアダプターで 2,400 以上のツールを提供しています。どのアダプターにも [anythingmcp.com/ja/guides](https://anythingmcp.com/ja/guides) に 7 言語の設定ガイドがあります。
266 個のアダプターで 2,400 以上のツールを提供しています。どのアダプターにも [anythingmcp.com/ja/guides](https://anythingmcp.com/ja/guides) に 7 言語の設定ガイドがあります。

| カテゴリー | 例 |
|---|---|
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.png" alt="AnythingMCP turns ERP, e-commerce, REST, SOAP and SQL systems into MCP tools for Claude and ChatGPT: 265 connectors, 21 of them with no API key." width="100%" />
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.png" alt="AnythingMCP turns ERP, e-commerce, REST, SOAP and SQL systems into MCP tools for Claude and ChatGPT: 266 connectors, 21 of them with no API key." width="100%" />
</p>

<h1 align="center">AnythingMCP: self-hosted MCP gateway</h1>
Expand All @@ -19,7 +19,7 @@

<p align="center">
<strong>AnythingMCP is an open-source, self-hosted MCP gateway that turns any REST/OpenAPI, SOAP, GraphQL, OData or SQL system into MCP tools for Claude, ChatGPT and Copilot, without writing an MCP server.</strong><br/>
It ships 265 ready connectors, among them SAP, Etsy, weclapp and Amazon Seller, and 21 of them need no API key.
It ships 266 ready connectors, among them SAP, Etsy, weclapp and Amazon Seller, and 21 of them need no API key.
</p>

<p align="center">
Expand Down Expand Up @@ -103,7 +103,7 @@ Tools register at runtime, without a restart. Per-connector `{{VAR}}` values are

## Connector catalog

265 adapters, exposing 2,400+ tools. Every one has a setup guide on [anythingmcp.com/guides](https://anythingmcp.com/guides), in seven languages.
266 adapters, exposing 2,400+ tools. Every one has a setup guide on [anythingmcp.com/guides](https://anythingmcp.com/guides), in seven languages.

| Category | Examples |
|---|---|
Expand Down
6 changes: 3 additions & 3 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<p align="center">
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.zh-CN.png" alt="AnythingMCP 将 ERP、电子商务、REST、SOAP 和 SQL 系统转化为 Claude 和 ChatGPT 可用的 MCP 工具:265 个连接器,其中 21 个无需 API 密钥。" width="100%" />
<img src="https://raw.githubusercontent.com/HelpCode-ai/anythingmcp/badges/banner.zh-CN.png" alt="AnythingMCP 将 ERP、电子商务、REST、SOAP 和 SQL 系统转化为 Claude 和 ChatGPT 可用的 MCP 工具:266 个连接器,其中 21 个无需 API 密钥。" width="100%" />
</p>

<h1 align="center">AnythingMCP:自行托管的 MCP 网关</h1>
Expand All @@ -19,7 +19,7 @@

<p align="center">
<strong>AnythingMCP 是一个开源、可自行托管的 MCP 网关,无需编写 MCP 服务器,即可将任意 REST/OpenAPI、SOAP、GraphQL、OData 或 SQL 系统转化为 Claude、ChatGPT 和 Copilot 可用的 MCP 工具。</strong><br/>
它自带 265 个现成适配器,涵盖 SAP、Etsy、weclapp 和 Amazon Seller 等,其中 21 个无需 API 密钥。
它自带 266 个现成适配器,涵盖 SAP、Etsy、weclapp 和 Amazon Seller 等,其中 21 个无需 API 密钥。
</p>

<p align="center">
Expand Down Expand Up @@ -111,7 +111,7 @@ docker compose up -d

## 连接器目录

共 265 个适配器,提供 2,400 多个工具。每个适配器都在 [anythingmcp.com/zh/guides](https://anythingmcp.com/zh/guides) 上提供七种语言的配置指南。
共 266 个适配器,提供 2,400 多个工具。每个适配器都在 [anythingmcp.com/zh/guides](https://anythingmcp.com/zh/guides) 上提供七种语言的配置指南。

| 类别 | 示例 |
|---|---|
Expand Down
23 changes: 22 additions & 1 deletion docs/tool-definition.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ leaving an unresolved `{{IS24_CONSUMER_KEY}}` in the credentials.

Each entry in `tools` needs a string `name`, a useful `description`, and its
JSON-Schema `parameters` when it accepts input. Parameter properties should
include descriptions for the model.
include descriptions for the model. `"enabled": false` installs a tool switched
off, for writes a workspace should turn on deliberately.

See [connector configuration](#connector)
and [authentication](#authentication) for the nested connector fields.
Expand Down Expand Up @@ -95,6 +96,26 @@ The body is signed exactly as it will be sent — signing a different rendering
of the same object is the usual way an HMAC integration fails with an error
that blames the key.

### MCP adapters (a vendor's own MCP server)

When a vendor already runs an official MCP server, the adapter bridges it
instead of describing its API again. `connector.type` is `MCP`, `baseUrl` is
the server's MCP endpoint (variables allowed, e.g.
`https://{{SPLUNK_HOST}}:8089/services/mcp`), and authentication is whatever
the server accepts (usually `BEARER_TOKEN`).

At install AnythingMCP asks that server for its tools (`tools/list`) and
installs what it lists, so a workspace gets exactly the tools of the server
version it runs. The adapter's `tools` array is a snapshot: it is what the
catalog shows, the fallback installed when the server cannot be reached at
install, and the place for policy. A snapshot tool with `"enabled": false`
installs switched off, and `annotations` set there fill the hints the server
leaves out (the server's own hints win).
Each tool's `endpointMapping` is `{ "method": "<tool name>", "path": "/mcp" }`.
Listing the tools is also the install check, so no `probe` is needed, and a
catalog update never rewrites or retires the tools of an MCP adapter: the
server owns them. See `intl/splunk.json`.

### DATABASE adapters

A `DATABASE` adapter points at a database instead of an HTTP API, so several
Expand Down
2 changes: 1 addition & 1 deletion glama.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
"maintainers": [
"keysersoft"
],
"description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 265 pre-built adapters for ERP and e-commerce (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, weclapp, Shopware, WooCommerce, Amazon Seller, Kaufland, OTTO\u2026) and more. Self-hosted, knowledge graph, per-tool response mapping, OAuth2/RBAC/SSO/audit. Open source under AGPL-3.0."
"description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 266 pre-built adapters for ERP and e-commerce (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, weclapp, Shopware, WooCommerce, Amazon Seller, Kaufland, OTTO\u2026) and more. Self-hosted, knowledge graph, per-tool response mapping, OAuth2/RBAC/SSO/audit. Open source under AGPL-3.0."
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "anythingmcp",
"version": "0.17.0",
"description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 265 pre-built adapters for ERP, e-commerce and more (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, Shopware, WooCommerce, Amazon Seller). Self-hosted, open source (AGPL-3.0).",
"description": "Turn any REST/OpenAPI, SOAP/WSDL, GraphQL, OData or SQL API into MCP tools for Claude, ChatGPT and Copilot, no code. 266 pre-built adapters for ERP, e-commerce and more (SAP S/4HANA, SAP Business One, Odoo, Xentral, JTL-Wawi, Shopware, WooCommerce, Amazon Seller). Self-hosted, open source (AGPL-3.0).",
"private": true,
"license": "AGPL-3.0-only",
"engines": {
Expand Down
61 changes: 54 additions & 7 deletions packages/backend/src/adapters/adapters.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { STARTER_PACK } from './starter-pack';
import { ConnectorsService } from '../connectors/connectors.service';
import { classifyToolExecutionError } from '../connectors/connector-error.util';
import { applyResponseTransform } from '../connectors/response-transform.util';
import { describeDiscoveredTools, mergeDiscoveredMcpTools } from './mcp-adapter.util';

@Injectable()
export class AdaptersService {
Expand Down Expand Up @@ -226,14 +227,57 @@ export class AdaptersService {

let toolsCreated = 0;

for (const tool of adapter.tools) {
// An adapter for a vendor's own MCP server installs the tools that server
// lists now; the catalog's copy is the fallback. Listing them is also the
// proof that the address and token work, so it stands in for the probe.
let toolsToCreate = adapter.tools;
let mcpProbe: ImportProbeResult | null = null;
if (adapter.connector.type === 'MCP') {
const started = Date.now();
try {
const discovered = await this.connectors.discoverRemoteMcpTools(connector);
toolsToCreate = mergeDiscoveredMcpTools(adapter.tools, discovered);
mcpProbe = {
ok: true,
toolName: 'tools/list',
durationMs: Date.now() - started,
sample: describeDiscoveredTools(discovered),
};
} catch (err: any) {
// The MCP SDK reports the HTTP status of a failed request as `code`.
const status: number | undefined =
typeof err?.status === 'number'
? err.status
: typeof err?.code === 'number' && err.code >= 400
? err.code
: undefined;
const upstream = String(err?.message ?? err ?? 'unknown error').slice(0, 400);
const { hint } = classifyToolExecutionError({
status,
authType: adapter.connector.authType,
message: upstream,
});
this.logger.warn(
`Could not list the tools of "${slug}" at install (${upstream}); installed the catalog's list`,
);
mcpProbe = {
ok: false,
toolName: 'tools/list',
durationMs: Date.now() - started,
status: status ?? null,
message: `${upstream} ${hint}`.trim(),
};
}
}

for (const tool of toolsToCreate) {
try {
await this.prisma.mcpTool.create({
data: {
connectorId: connector.id,
name: tool.name,
description: tool.description,
isEnabled: true,
isEnabled: tool.enabled !== false,
// Seed the proxy preference from the adapter spec (default off).
useProxy: tool.useProxy === true,
parameters: tool.parameters as any,
Expand All @@ -259,11 +303,14 @@ export class AdaptersService {
`Imported adapter "${slug}" as connector ${connector.id} with ${toolsCreated} tools`,
);

const probe = await this.runImportProbe(
adapter,
connector.id,
resolvedAuthConfig as Record<string, unknown> | null,
);
const probe =
adapter.connector.type === 'MCP'
? mcpProbe
: await this.runImportProbe(
adapter,
connector.id,
resolvedAuthConfig as Record<string, unknown> | null,
);

return { connectorId: connector.id, toolsCreated, probe };
}
Expand Down
9 changes: 9 additions & 0 deletions packages/backend/src/adapters/catalog.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,15 @@ describe('adapter catalog', () => {
(_name, tool) => {
const em = tool.endpointMapping as Record<string, unknown>;

// A tool of a vendor's MCP server is called by name on the remote
// server: `method` is that name and `path` the MCP endpoint, not an
// HTTP verb and URL.
if (adapter.connector.type === 'MCP') {
expect(em.method).toBe(tool.name);
expect(typeof em.path).toBe('string');
return;
}

const isDatabase = adapter.connector.type === 'DATABASE';
const allowed = isDatabase
? VALID_DATABASE_METHODS
Expand Down
5 changes: 5 additions & 0 deletions packages/backend/src/adapters/catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ import * as signwell from './intl/signwell.json';
import * as slab from './intl/slab.json';
import * as snov from './intl/snov.json';
import * as sorare from './intl/sorare.json';
import * as splunk from './intl/splunk.json';
import * as statsig from './intl/statsig.json';
import * as streak from './intl/streak.json';
import * as substack from './intl/substack.json';
Expand Down Expand Up @@ -355,6 +356,9 @@ export interface AdapterDefinition extends AdapterMeta {
* `readOnlyHint` for a read exposed over POST. Seeds mcp_tools.annotations
* on import, the same column a user override lives in. */
annotations?: Record<string, unknown>;
/** `false` installs the tool switched off, for writes a workspace should
* opt into rather than get by default. Default true. */
enabled?: boolean;
}>;
}

Expand Down Expand Up @@ -631,6 +635,7 @@ const RAW_ADAPTERS: AdapterDefinition[] = [
slab as unknown as AdapterDefinition,
snov as unknown as AdapterDefinition,
sorare as unknown as AdapterDefinition,
splunk as unknown as AdapterDefinition,
statsig as unknown as AdapterDefinition,
streak as unknown as AdapterDefinition,
substack as unknown as AdapterDefinition,
Expand Down
Loading
Loading