feat(mcp): setup mcp plugins (#2895)
8
.cursor/mcp.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"mcpServers": {
|
||||
"algolia-docsearch": {
|
||||
"type": "http",
|
||||
"url": "https://mcp.algolia.com/1/docsearch/mcp"
|
||||
}
|
||||
}
|
||||
}
|
||||
1
.cursor/rules/use-algolia-docsearch.mdc
Symbolic link
|
|
@ -0,0 +1 @@
|
|||
../../mcp/plugins/docsearch/cursor/algolia-docsearch/rules/use-algolia-docsearch.mdc
|
||||
1
.cursor/settings.json
Normal file
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
|
|
@ -1,2 +1,2 @@
|
|||
bun 1.3.10
|
||||
node 22.15.0
|
||||
bun 1.3.10
|
||||
nodejs latest
|
||||
|
|
|
|||
|
|
@ -111,6 +111,10 @@ export default App;
|
|||
|
||||
[Read documentation →](https://docsearch.algolia.com/docs/styling)
|
||||
|
||||
## MCP plugins
|
||||
|
||||
Client plugins for the public DocSearch MCP endpoint are in [`mcp/plugins/docsearch`](mcp/plugins/docsearch). They connect Cursor and Claude Code to `https://mcp.algolia.com/1/docsearch/mcp` for current public developer documentation.
|
||||
|
||||
## Related projects
|
||||
|
||||
DocSearch is made of the following repositories:
|
||||
|
|
|
|||
9
mcp/README.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# DocSearch MCP
|
||||
|
||||
Client plugin packages for the public Algolia DocSearch MCP endpoint live in [`plugins/docsearch`](plugins/docsearch).
|
||||
|
||||
```text
|
||||
https://mcp.algolia.com/1/docsearch/mcp
|
||||
```
|
||||
|
||||
The plugins connect AI coding clients to the public DocSearch documentation corpus. They do not expose crawler operations, DocSearch administration, private documentation, or Algolia index credentials.
|
||||
71
mcp/plugins/docsearch/README.md
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
# Algolia DocSearch MCP Plugins
|
||||
|
||||
This directory contains client plugin packages for the public Algolia DocSearch MCP endpoint:
|
||||
|
||||
```text
|
||||
https://mcp.algolia.com/1/docsearch/mcp
|
||||
```
|
||||
|
||||
The plugins connect AI coding clients to the public DocSearch documentation corpus. They do not expose crawler operations, DocSearch administration, private documentation, or Algolia index credentials.
|
||||
|
||||
## Packages
|
||||
|
||||
- `mcp/plugins/docsearch/cursor/algolia-docsearch` - Cursor plugin package with MCP config, rule, skill, and README.
|
||||
- `mcp/plugins/docsearch/claude/algolia-docsearch` - Claude Code plugin package with MCP config, skill, command, and README.
|
||||
|
||||
## Public MCP Tools
|
||||
|
||||
You can query in natural language — full sentences and questions work well.
|
||||
|
||||
### algolia_docsearch_search_docs
|
||||
|
||||
One-shot lookup, and the right default for most questions. Pass a `library` and a `query`; it resolves the best matching documentation set and returns ranked content in a single call:
|
||||
|
||||
```json
|
||||
{
|
||||
"library": "Next.js",
|
||||
"query": "how do middleware matchers work"
|
||||
}
|
||||
```
|
||||
|
||||
If the library is ambiguous, it returns candidate documentation sets instead — pick a `docset_id` and pass it to `algolia_docsearch_query_docs`.
|
||||
|
||||
### algolia_docsearch_resolve_docset
|
||||
|
||||
Step 1 of the manual flow. Finds matching documentation sets and returns candidates with:
|
||||
|
||||
- `docset_id`
|
||||
- title and description
|
||||
- optional quality signals such as `trustScore`, `benchmarkScore`, and `popularityScore`
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "Next.js app router"
|
||||
}
|
||||
```
|
||||
|
||||
### algolia_docsearch_query_docs
|
||||
|
||||
Step 2 of the manual flow. Queries documentation content for the selected `docset_id` values. Pass several when a question spans multiple products:
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "middleware matcher config",
|
||||
"docsetIds": ["nextjs"]
|
||||
}
|
||||
```
|
||||
|
||||
## Claude Desktop And claude.ai
|
||||
|
||||
Claude Desktop and claude.ai can connect directly to the same remote MCP endpoint when remote connectors are available in the client:
|
||||
|
||||
```json
|
||||
{
|
||||
"algolia-docsearch": {
|
||||
"type": "http",
|
||||
"url": "https://mcp.algolia.com/1/docsearch/mcp"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
No user authentication is required for the public DocSearch MCP endpoint.
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"name": "algolia-docsearch-marketplace",
|
||||
"description": "Algolia DocSearch plugins for Claude Code — search up-to-date public developer documentation from the DocSearch corpus.",
|
||||
"owner": {
|
||||
"name": "Algolia"
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "algolia-docsearch",
|
||||
"source": ".",
|
||||
"description": "up-to-date public developer documentation from the DocSearch corpus.",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "algolia-docsearch",
|
||||
"description": "Algolia DocSearch MCP plugin for searching up-to-date public developer documentation from the DocSearch corpus.",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "Algolia"
|
||||
}
|
||||
}
|
||||
6
mcp/plugins/docsearch/claude/algolia-docsearch/.mcp.json
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"algolia-docsearch": {
|
||||
"type": "http",
|
||||
"url": "https://mcp.algolia.com/1/docsearch/mcp"
|
||||
}
|
||||
}
|
||||
63
mcp/plugins/docsearch/claude/algolia-docsearch/README.md
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
# Algolia DocSearch Plugin for Claude Code
|
||||
|
||||
Algolia DocSearch connects Claude Code to the public DocSearch MCP endpoint for current public developer documentation.
|
||||
|
||||
## What's Included
|
||||
|
||||
- **MCP Server** - Connects Claude Code to `https://mcp.algolia.com/1/docsearch/mcp`.
|
||||
- **Skill** - Auto-triggers documentation lookups for public developer docs questions.
|
||||
- **Command** - `/algolia-docsearch:docs` for manual documentation queries.
|
||||
|
||||
The plugin teaches the one-shot `search_docs` lookup and the `resolve_docset` + `query_docs` flow.
|
||||
|
||||
## Installation
|
||||
|
||||
For local beta testing, install this plugin package from:
|
||||
|
||||
```text
|
||||
mcp/plugins/docsearch/claude/algolia-docsearch
|
||||
```
|
||||
|
||||
The MCP server config is also available at:
|
||||
|
||||
```text
|
||||
mcp/plugins/docsearch/claude/algolia-docsearch/.mcp.json
|
||||
```
|
||||
|
||||
For Claude Code marketplace install from this repository:
|
||||
|
||||
```text
|
||||
/plugin marketplace add algolia/docsearch
|
||||
/plugin install algolia-docsearch@algolia-docsearch-marketplace
|
||||
```
|
||||
|
||||
## Available Tools
|
||||
|
||||
### algolia_docsearch_search_docs
|
||||
|
||||
One-shot lookup, and the right default for most questions. Pass a `library` (product or platform) and a `query` (the question); it resolves the best documentation set and returns ranked content in a single call.
|
||||
|
||||
### algolia_docsearch_resolve_docset
|
||||
|
||||
Step 1 of the manual flow. Finds matching documentation sets and returns candidates with a `docset_id`, title, description, and ranking signals.
|
||||
|
||||
### algolia_docsearch_query_docs
|
||||
|
||||
Step 2 of the manual flow. Queries documentation content for the `docset_id` values returned by `algolia_docsearch_resolve_docset`. Pass several `docsetIds` when a question spans multiple products.
|
||||
|
||||
## Usage Examples
|
||||
|
||||
Ask Claude questions like:
|
||||
|
||||
- "How do I configure middleware in Next.js?"
|
||||
- "Show me Stripe webhook signature verification from the docs."
|
||||
- "What is the current Algolia InstantSearch React setup?"
|
||||
|
||||
Or use the manual command:
|
||||
|
||||
```text
|
||||
/algolia-docsearch:docs Next.js middleware matcher
|
||||
/algolia-docsearch:docs Stripe webhook signature verification
|
||||
```
|
||||
|
||||
The plugin is for public developer documentation only. It does not expose crawler operations, DocSearch administration, private docs, or Algolia index credentials.
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
---
|
||||
description: Look up public developer documentation with Algolia DocSearch
|
||||
argument-hint: [query]
|
||||
---
|
||||
|
||||
# /algolia-docsearch:docs
|
||||
|
||||
Fetch current public developer documentation from the Algolia DocSearch MCP corpus.
|
||||
|
||||
## Usage
|
||||
|
||||
```text
|
||||
/algolia-docsearch:docs <library-or-product> [topic]
|
||||
```
|
||||
|
||||
For most lookups, call `algolia_docsearch_search_docs` in a single step:
|
||||
|
||||
1. Set `library` to the product, library, or platform (use the official name).
|
||||
2. Set `query` to the topic or question, in natural language.
|
||||
3. Answer using the returned docs and include source URLs when available.
|
||||
|
||||
If the library is ambiguous, `algolia_docsearch_search_docs` returns candidate documentation sets — pick the right `docset_id` and pass it to `algolia_docsearch_query_docs`. Use the `algolia_docsearch_resolve_docset` + `algolia_docsearch_query_docs` flow when a question spans several products.
|
||||
|
||||
## Examples
|
||||
|
||||
```text
|
||||
/algolia-docsearch:docs Next.js middleware matcher
|
||||
/algolia-docsearch:docs Stripe webhook signature verification
|
||||
/algolia-docsearch:docs Algolia InstantSearch React configure search client
|
||||
/algolia-docsearch:docs React Server Components data fetching
|
||||
```
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
---
|
||||
name: algolia-docsearch-mcp
|
||||
description: Use this skill when the user asks about public developer documentation, SDKs, APIs, libraries, frameworks, setup, configuration, or code examples. Fetch current docs from Algolia DocSearch MCP and cite source URLs.
|
||||
---
|
||||
|
||||
When the user asks about public developer documentation, use Algolia DocSearch MCP instead of relying only on training data.
|
||||
|
||||
## When To Use
|
||||
|
||||
Use this skill when the user:
|
||||
|
||||
- Asks setup or configuration questions for a public library, framework, SDK, API, or developer tool.
|
||||
- Requests code examples that should match current docs.
|
||||
- Needs API reference details, migration guidance, or command syntax.
|
||||
- Mentions a library or framework whose docs may have changed recently.
|
||||
- Asks for sources or citations from public documentation.
|
||||
|
||||
Do not use this skill for private company docs, internal repositories, unpublished APIs, or questions where the user already supplied the relevant docs.
|
||||
|
||||
## Tools
|
||||
|
||||
DocSearch MCP exposes three tools. You can query in natural language — full sentences and questions work well.
|
||||
|
||||
- `algolia_docsearch_search_docs` — one-shot lookup. Use this by default.
|
||||
- `algolia_docsearch_resolve_docset` — step 1 of the manual flow: find documentation sets.
|
||||
- `algolia_docsearch_query_docs` — step 2 of the manual flow: fetch content for chosen docsets.
|
||||
|
||||
## Default Flow: One-Shot Search
|
||||
|
||||
Call `algolia_docsearch_search_docs` for most lookups.
|
||||
|
||||
Input:
|
||||
|
||||
- `library`: the product, library, SDK, or platform. Use the official name (for example: `Next.js`, `Stripe`, `Algolia InstantSearch`).
|
||||
- `query`: the question, in natural language (for example: `how do middleware matchers work`).
|
||||
|
||||
It resolves the best matching documentation set and returns ranked content in a single call. If `library` is ambiguous, it returns candidate documentation sets instead — pick the right one and pass its `docset_id` to `algolia_docsearch_query_docs`, or retry with the official product name.
|
||||
|
||||
## Manual Flow: Resolve, Then Query
|
||||
|
||||
Use the two-step flow when a question spans several products, or when you want to inspect and hand-pick documentation sets.
|
||||
|
||||
### Step 1: Resolve The Docset
|
||||
|
||||
Call `algolia_docsearch_resolve_docset`.
|
||||
|
||||
Input:
|
||||
|
||||
- `query`: describe the product, library, SDK, or platform. Including the vendor name improves matching.
|
||||
- `topN`: optional. Use the default unless the initial result is ambiguous.
|
||||
|
||||
Each candidate returns a `title`, `docset_id`, `description`, and ranking signals (`trustScore`, `benchmarkScore`, `popularityScore`). Prefer the official vendor's docset over third-party mentions, breaking ties by the higher scores.
|
||||
|
||||
### Step 2: Query The Docs
|
||||
|
||||
Call `algolia_docsearch_query_docs`.
|
||||
|
||||
Input:
|
||||
|
||||
- `query`: what to find in the docs, in natural language.
|
||||
- `docsetIds`: an array of the `docset_id` values you selected. Pass several when a question spans multiple products.
|
||||
|
||||
## Answer With Sources
|
||||
|
||||
Use the returned documentation content to answer the user directly.
|
||||
|
||||
Guidelines:
|
||||
|
||||
- Include source URLs from the tool result when available.
|
||||
- Say when DocSearch does not return a relevant result.
|
||||
- Do not invent source citations.
|
||||
- Keep the answer focused on the user's question.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"name": "algolia-docsearch",
|
||||
"version": "1.0.0",
|
||||
"description": "Algolia DocSearch MCP plugin for searching up-to-date public developer documentation from the DocSearch corpus.",
|
||||
"author": {
|
||||
"name": "Algolia"
|
||||
},
|
||||
"homepage": "https://docsearch.algolia.com/docs/mcp/overview",
|
||||
"keywords": ["documentation", "mcp", "algolia", "docsearch", "developer-docs"],
|
||||
"logo": "assets/docsearch-monogram.svg"
|
||||
}
|
||||
47
mcp/plugins/docsearch/cursor/algolia-docsearch/README.md
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
# Algolia DocSearch Plugin for Cursor
|
||||
|
||||
Algolia DocSearch connects Cursor to the public DocSearch MCP endpoint for current public developer documentation.
|
||||
|
||||
## What's Included
|
||||
|
||||
- **MCP Server** - Connects Cursor to `https://mcp.algolia.com/1/docsearch/mcp`.
|
||||
- **Rule** - Nudges the agent to use DocSearch for public developer docs instead of guessing from training data.
|
||||
- **Skill** - Documents the one-shot `search_docs` lookup and the `resolve_docset` + `query_docs` flow.
|
||||
|
||||
## Installation
|
||||
|
||||
For local beta testing, install this plugin package from:
|
||||
|
||||
```text
|
||||
mcp/plugins/docsearch/cursor/algolia-docsearch
|
||||
```
|
||||
|
||||
The MCP server config is also available at:
|
||||
|
||||
```text
|
||||
mcp/plugins/docsearch/cursor/algolia-docsearch/mcp.json
|
||||
```
|
||||
|
||||
## Available Tools
|
||||
|
||||
### algolia_docsearch_search_docs
|
||||
|
||||
One-shot lookup, and the right default for most questions. Pass a `library` (product or platform) and a `query` (the question); it resolves the best documentation set and returns ranked content in a single call.
|
||||
|
||||
### algolia_docsearch_resolve_docset
|
||||
|
||||
Step 1 of the manual flow. Finds matching documentation sets and returns candidates with a `docset_id`, title, description, and ranking signals.
|
||||
|
||||
### algolia_docsearch_query_docs
|
||||
|
||||
Step 2 of the manual flow. Queries documentation content for the `docset_id` values returned by `algolia_docsearch_resolve_docset`. Pass several `docsetIds` when a question spans multiple products.
|
||||
|
||||
## Usage Examples
|
||||
|
||||
Ask Cursor questions like:
|
||||
|
||||
- "How do I configure middleware in Next.js?"
|
||||
- "Show me Stripe webhook signature verification from the docs."
|
||||
- "What is the current Algolia InstantSearch React setup?"
|
||||
|
||||
The plugin is for public developer documentation only. It does not expose crawler operations, DocSearch administration, private docs, or Algolia index credentials.
|
||||
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -10 96 98"><path fill="#5468ff" d="M36.493 77.289H3.074A3.067 3.067 0 0 1 0 74.228h36.523c12.769.062 24.6-6.663 31.038-17.642a35.45 35.45 0 0 0 .174-35.584C61.404 9.962 49.639 3.122 36.87 3.061H0A3.067 3.067 0 0 1 3.074 0H36.87c10.31.01 20.193 4.1 27.473 11.369a38.6 38.6 0 0 1 11.341 27.384c-.06 21.366-17.741 38.536-39.19 38.536z"/><path fill="#5468ff" d="M0 69.045h23.711a11.78 11.78 0 0 0 7.933-3.031H0zM0 60.8h36.374c.734-.987 1.418-1.975 2.053-3.07H0zm0-8.254h41.025a30 30 0 0 0 1.091-3.06H0zm0-8.244h43.306c.149-.987.268-2.034.337-3.061H0zm0-8.244h43.633a30 30 0 0 1-.337-3.071H0zm0-8.254h42.116a36 36 0 0 0-1.09-3.061H0zm0-8.245h38.427a33 33 0 0 1-2.053-3.06H0zM0 8.244v3.071h31.674a19.04 19.04 0 0 0-7.934-3.031z"/></svg>
|
||||
|
After Width: | Height: | Size: 784 B |
8
mcp/plugins/docsearch/cursor/algolia-docsearch/mcp.json
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"mcpServers": {
|
||||
"algolia-docsearch": {
|
||||
"type": "http",
|
||||
"url": "https://mcp.algolia.com/1/docsearch/mcp"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
description: Use Algolia DocSearch MCP for current public developer documentation instead of guessing from training data.
|
||||
alwaysApply: true
|
||||
---
|
||||
|
||||
When the user asks about public developer documentation, APIs, SDKs, libraries, frameworks, configuration, or code examples, use Algolia DocSearch MCP to fetch current documentation before answering.
|
||||
|
||||
Use Algolia DocSearch when:
|
||||
- The user asks about a public library, framework, SDK, API, or developer tool.
|
||||
- The user needs syntax, configuration, migration, setup, or code examples from docs.
|
||||
- The question may depend on recent documentation changes.
|
||||
- You need source URLs to support an answer.
|
||||
|
||||
Do not use Algolia DocSearch for:
|
||||
- Private company docs, internal repos, or unpublished APIs.
|
||||
- Questions already answered by code or docs the user provided.
|
||||
- Crawler operations, DocSearch administration, or MCP server implementation details.
|
||||
- General programming concepts that do not require external docs.
|
||||
|
||||
For most lookups call `algolia_docsearch_search_docs` with the product as `library` and the question as `query`. Use the `algolia_docsearch_resolve_docset` + `algolia_docsearch_query_docs` flow when a question spans several products or you need to hand-pick documentation sets. Natural-language queries work well.
|
||||
|
||||
See the `algolia-docsearch-mcp` skill for the full tool flow.
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
---
|
||||
name: algolia-docsearch-mcp
|
||||
description: Use this skill when the user asks about public developer documentation, SDKs, APIs, libraries, frameworks, setup, configuration, or code examples. Fetch current docs from Algolia DocSearch MCP and cite source URLs.
|
||||
---
|
||||
|
||||
When the user asks about public developer documentation, use Algolia DocSearch MCP instead of relying only on training data.
|
||||
|
||||
## When To Use
|
||||
|
||||
Use this skill when the user:
|
||||
|
||||
- Asks setup or configuration questions for a public library, framework, SDK, API, or developer tool.
|
||||
- Requests code examples that should match current docs.
|
||||
- Needs API reference details, migration guidance, or command syntax.
|
||||
- Mentions a library or framework whose docs may have changed recently.
|
||||
- Asks for sources or citations from public documentation.
|
||||
|
||||
Do not use this skill for private company docs, internal repositories, unpublished APIs, or questions where the user already supplied the relevant docs.
|
||||
|
||||
## Tools
|
||||
|
||||
DocSearch MCP exposes three tools. You can query in natural language — full sentences and questions work well.
|
||||
|
||||
- `algolia_docsearch_search_docs` — one-shot lookup. Use this by default.
|
||||
- `algolia_docsearch_resolve_docset` — step 1 of the manual flow: find documentation sets.
|
||||
- `algolia_docsearch_query_docs` — step 2 of the manual flow: fetch content for chosen docsets.
|
||||
|
||||
## Default Flow: One-Shot Search
|
||||
|
||||
Call `algolia_docsearch_search_docs` for most lookups.
|
||||
|
||||
Input:
|
||||
|
||||
- `library`: the product, library, SDK, or platform. Use the official name (for example: `Next.js`, `Stripe`, `Algolia InstantSearch`).
|
||||
- `query`: the question, in natural language (for example: `how do middleware matchers work`).
|
||||
|
||||
It resolves the best matching documentation set and returns ranked content in a single call. If `library` is ambiguous, it returns candidate documentation sets instead — pick the right one and pass its `docset_id` to `algolia_docsearch_query_docs`, or retry with the official product name.
|
||||
|
||||
## Manual Flow: Resolve, Then Query
|
||||
|
||||
Use the two-step flow when a question spans several products, or when you want to inspect and hand-pick documentation sets.
|
||||
|
||||
### Step 1: Resolve The Docset
|
||||
|
||||
Call `algolia_docsearch_resolve_docset`.
|
||||
|
||||
Input:
|
||||
|
||||
- `query`: describe the product, library, SDK, or platform. Including the vendor name improves matching.
|
||||
- `topN`: optional. Use the default unless the initial result is ambiguous.
|
||||
|
||||
Each candidate returns a `title`, `docset_id`, `description`, and ranking signals (`trustScore`, `benchmarkScore`, `popularityScore`). Prefer the official vendor's docset over third-party mentions, breaking ties by the higher scores.
|
||||
|
||||
### Step 2: Query The Docs
|
||||
|
||||
Call `algolia_docsearch_query_docs`.
|
||||
|
||||
Input:
|
||||
|
||||
- `query`: what to find in the docs, in natural language.
|
||||
- `docsetIds`: an array of the `docset_id` values you selected. Pass several when a question spans multiple products.
|
||||
|
||||
## Answer With Sources
|
||||
|
||||
Use the returned documentation content to answer the user directly.
|
||||
|
||||
Guidelines:
|
||||
|
||||
- Include source URLs from the tool result when available.
|
||||
- Say when DocSearch does not return a relevant result.
|
||||
- Do not invent source citations.
|
||||
- Keep the answer focused on the user's question.
|
||||
26
packages/website/docs/mcp/installation.mdx
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
---
|
||||
title: Install DocSearch MCP
|
||||
sidebar_label: Installation
|
||||
---
|
||||
|
||||
import MCPInstall from '@site/src/components/mcp/MCPInstall';
|
||||
|
||||
DocSearch MCP is a remote MCP server. Point any MCP-compatible client at this endpoint — no authentication required:
|
||||
|
||||
```text
|
||||
https://mcp.algolia.com/1/docsearch/mcp
|
||||
```
|
||||
|
||||
You can install it as a **plugin** (ships the MCP server plus client guidance like rules, skills, and commands) or **manually** (just the MCP server config). Pick your client below.
|
||||
|
||||
<MCPInstall />
|
||||
|
||||
## Verify the install
|
||||
|
||||
Ask your MCP client a public documentation question, for example:
|
||||
|
||||
```text
|
||||
Use DocSearch MCP to find the current Next.js middleware matcher docs.
|
||||
```
|
||||
|
||||
The client should call the DocSearch tools and answer with content from the matching documentation, ideally with source links.
|
||||
43
packages/website/docs/mcp/overview.mdx
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
---
|
||||
title: DocSearch MCP
|
||||
sidebar_label: Overview
|
||||
---
|
||||
|
||||
DocSearch MCP lets AI clients search current public developer documentation from the DocSearch corpus.
|
||||
|
||||
Use it when you want an assistant to answer questions from public docs instead of relying only on model training data. The public endpoint does not require authentication:
|
||||
|
||||
```text
|
||||
https://mcp.algolia.com/1/docsearch/mcp
|
||||
```
|
||||
|
||||
## What it does
|
||||
|
||||
DocSearch MCP exposes documentation search through the [Model Context Protocol](https://modelcontextprotocol.io/). MCP-compatible clients connect to the endpoint and call DocSearch tools while answering your questions.
|
||||
|
||||
The endpoint is focused on public developer documentation. You do not need an Algolia application ID, search API key, or DocSearch application to use it.
|
||||
|
||||
## How it works
|
||||
|
||||
Most lookups are a single call: name the product and ask your question, and DocSearch finds the right documentation set and returns the matching content together.
|
||||
|
||||
When a question spans several products, or you want to inspect and hand-pick documentation sets first, there is a two-step flow: resolve the documentation sets, then query the ones you choose.
|
||||
|
||||
## Available tools
|
||||
|
||||
### `algolia_docsearch_search_docs`
|
||||
|
||||
The one-shot tool, and the right default for most lookups. Give it a `library` (the product, SDK, or platform) and a `query` (your question); it resolves the best matching documentation set and returns ranked content in a single call. If the library is ambiguous, it returns candidate documentation sets to choose from instead.
|
||||
|
||||
### `algolia_docsearch_resolve_docset`
|
||||
|
||||
Step 1 of the manual flow. Finds the documentation sets that best match a product, library, or platform and returns candidates — each with a `docset_id`, title, description, and ranking signals to help pick the best match.
|
||||
|
||||
### `algolia_docsearch_query_docs`
|
||||
|
||||
Step 2 of the manual flow. Retrieves documentation content for one or more `docset_id`s returned by `algolia_docsearch_resolve_docset`. Pass several at once when a question spans multiple products.
|
||||
|
||||
## Next steps
|
||||
|
||||
- [Install DocSearch MCP](/docs/mcp/installation)
|
||||
- [Use DocSearch MCP](/docs/mcp/usage)
|
||||
113
packages/website/docs/mcp/usage.mdx
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
---
|
||||
title: Use DocSearch MCP
|
||||
sidebar_label: Usage
|
||||
---
|
||||
|
||||
DocSearch MCP works best when your client knows to search public documentation before answering library, framework, API, or SDK questions.
|
||||
|
||||
## Ask documentation questions
|
||||
|
||||
After installation, ask your client about public developer docs in natural language:
|
||||
|
||||
```text
|
||||
How do I configure middleware matchers in Next.js?
|
||||
```
|
||||
|
||||
```text
|
||||
Show me the current Stripe webhook signature verification docs.
|
||||
```
|
||||
|
||||
```text
|
||||
What is the current setup for Algolia InstantSearch React?
|
||||
```
|
||||
|
||||
If your client does not automatically use MCP tools, mention DocSearch MCP explicitly:
|
||||
|
||||
```text
|
||||
Use DocSearch MCP to look up React Server Components data fetching.
|
||||
```
|
||||
|
||||
## Use the Claude Code command
|
||||
|
||||
The Claude Code plugin includes a manual command:
|
||||
|
||||
```text
|
||||
/algolia-docsearch:docs <library-or-product> [topic]
|
||||
```
|
||||
|
||||
Examples:
|
||||
|
||||
```text
|
||||
/algolia-docsearch:docs Next.js middleware matcher
|
||||
/algolia-docsearch:docs Stripe webhook signature verification
|
||||
/algolia-docsearch:docs Algolia InstantSearch React configure search client
|
||||
```
|
||||
|
||||
## Tool flow
|
||||
|
||||
DocSearch MCP exposes three tools. Most of the time the client only needs the one-shot tool; the two-step flow is for multi-product questions or when you want to hand-pick documentation sets.
|
||||
|
||||
You can ask in natural language — full sentences and questions work well. For the one-shot tool, keep `library` to the product name and put the actual question in `query`.
|
||||
|
||||
### One-shot: `algolia_docsearch_search_docs`
|
||||
|
||||
The client names the product and asks the question in a single call:
|
||||
|
||||
```json
|
||||
{
|
||||
"library": "Next.js",
|
||||
"query": "how do middleware matchers work"
|
||||
}
|
||||
```
|
||||
|
||||
It returns ranked documentation content for the best matching set. If the library is ambiguous, it returns candidate documentation sets instead so the client can pick one and fall back to `algolia_docsearch_query_docs`.
|
||||
|
||||
### Two-step: resolve, then query
|
||||
|
||||
For questions that span several products, or when the client wants to choose documentation sets explicitly:
|
||||
|
||||
1. `algolia_docsearch_resolve_docset` finds documentation sets:
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "Next.js app router"
|
||||
}
|
||||
```
|
||||
|
||||
It returns candidates, each with a `docset_id`.
|
||||
|
||||
2. `algolia_docsearch_query_docs` retrieves content for the chosen `docset_id`(s):
|
||||
|
||||
```json
|
||||
{
|
||||
"query": "middleware matcher config",
|
||||
"docsetIds": ["nextjs"]
|
||||
}
|
||||
```
|
||||
|
||||
Pass multiple `docsetIds` when a question spans more than one product.
|
||||
|
||||
## Tips
|
||||
|
||||
- Be specific about the product and topic you want.
|
||||
- Include a version when it matters.
|
||||
- Ask for source URLs if you want the client to show where the answer came from.
|
||||
- If the first result is too broad, ask for a narrower topic.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### The client does not call DocSearch MCP
|
||||
|
||||
Make sure the MCP server is enabled in your client and named `algolia-docsearch`. If you installed the plugin, check that the plugin is enabled too.
|
||||
|
||||
### The result is about the wrong product
|
||||
|
||||
Ask again with the official product name. For the one-shot tool, set `library` to the vendor's product name (for example, `Algolia InstantSearch` rather than `search`).
|
||||
|
||||
### The client cannot connect
|
||||
|
||||
Confirm that your client supports remote HTTP MCP servers and that the configured URL is:
|
||||
|
||||
```text
|
||||
https://mcp.algolia.com/1/docsearch/mcp
|
||||
```
|
||||
|
|
@ -111,6 +111,11 @@ export default {
|
|||
to: 'docs/what-is-docsearch',
|
||||
position: 'left',
|
||||
},
|
||||
{
|
||||
label: 'MCP',
|
||||
to: 'docs/mcp/overview',
|
||||
position: 'left',
|
||||
},
|
||||
{
|
||||
label: 'Playground',
|
||||
to: 'https://community.algolia.com/docsearch-playground/',
|
||||
|
|
|
|||
|
|
@ -21,6 +21,11 @@ export default {
|
|||
label: 'DocSearch v4',
|
||||
items: ['docsearch', 'docusaurus-adapter', 'composable-api', 'styling', 'api', 'examples', 'migrating-from-v3'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'MCP',
|
||||
items: ['mcp/overview', 'mcp/installation', 'mcp/usage'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Algolia Ask AI',
|
||||
|
|
|
|||
657
packages/website/src/components/mcp/MCPInstall.jsx
Normal file
|
|
@ -0,0 +1,657 @@
|
|||
import useBaseUrl from '@docusaurus/useBaseUrl';
|
||||
import { Code2 } from 'lucide-react';
|
||||
import { AnimatePresence, motion, useReducedMotion } from 'motion/react';
|
||||
import React, { useCallback, useState } from 'react';
|
||||
|
||||
const ENDPOINT = 'https://mcp.algolia.com/1/docsearch/mcp';
|
||||
|
||||
// Base64 of {"url":"https://mcp.algolia.com/1/docsearch/mcp"} for the Cursor install link.
|
||||
const CURSOR_DEEPLINK =
|
||||
'https://cursor.com/en-US/install-mcp?name=algolia-docsearch&config=eyJ1cmwiOiJodHRwczovL21jcC5hbGdvbGlhLmNvbS8xL2RvY3NlYXJjaC9tY3AifQ%3D%3D';
|
||||
|
||||
const SPRING = { type: 'spring', stiffness: 800, damping: 38, mass: 0.35 };
|
||||
|
||||
const CLIENTS = [
|
||||
{
|
||||
id: 'cursor',
|
||||
name: 'Cursor',
|
||||
blurb: 'Plugin · 1-click · manual',
|
||||
logo: 'cursor.svg',
|
||||
logoDark: 'cursor_dark.svg',
|
||||
plugin: [
|
||||
{ kind: 'installButton', href: CURSOR_DEEPLINK, label: 'Install in Cursor' },
|
||||
{ kind: 'text', content: 'Install the Cursor plugin package from the DocSearch repository:' },
|
||||
{ kind: 'code', caption: 'Plugin package', code: 'mcp/plugins/docsearch/cursor/algolia-docsearch' },
|
||||
{
|
||||
kind: 'text',
|
||||
content:
|
||||
'It ships the MCP server, a rule, and a skill that teach Cursor when and how to call the DocSearch tools.',
|
||||
},
|
||||
],
|
||||
manual: [
|
||||
{ kind: 'installButton', href: CURSOR_DEEPLINK, label: 'Install in Cursor' },
|
||||
{ kind: 'text', content: 'Or add it to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):' },
|
||||
{
|
||||
kind: 'code',
|
||||
caption: '~/.cursor/mcp.json',
|
||||
code: `{
|
||||
"mcpServers": {
|
||||
"algolia-docsearch": {
|
||||
"url": "${ENDPOINT}"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'claude',
|
||||
name: 'Claude',
|
||||
blurb: 'Code & Desktop',
|
||||
logo: 'claude.svg',
|
||||
plugin: [
|
||||
{ kind: 'subhead', content: 'Claude Code' },
|
||||
{ kind: 'text', content: 'Add the marketplace and install the plugin from inside Claude Code:' },
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'In Claude Code',
|
||||
code: `/plugin marketplace add algolia/docsearch
|
||||
/plugin install algolia-docsearch@algolia-docsearch-marketplace`,
|
||||
},
|
||||
{
|
||||
kind: 'text',
|
||||
content:
|
||||
'The plugin adds the MCP server, a skill, and the /algolia-docsearch:docs command. Plugins are a Claude Code feature — Claude Desktop connects via a custom connector (see Manual).',
|
||||
},
|
||||
],
|
||||
manual: [
|
||||
{ kind: 'subhead', content: 'Claude Code' },
|
||||
{ kind: 'text', content: 'Add the remote server with the Claude Code CLI:' },
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'Terminal',
|
||||
code: `claude mcp add --scope user --transport http algolia-docsearch ${ENDPOINT}`,
|
||||
},
|
||||
{ kind: 'subhead', content: 'Claude Desktop' },
|
||||
{
|
||||
kind: 'steps',
|
||||
items: ['Open Settings → Connectors.', 'Click Add custom connector.', 'Enter the name and URL, then save.'],
|
||||
},
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'Connector',
|
||||
code: `Name: Algolia DocSearch
|
||||
URL: ${ENDPOINT}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'codex',
|
||||
name: 'Codex',
|
||||
blurb: 'CLI · config.toml',
|
||||
logo: 'codex.svg',
|
||||
logoDark: 'codex_dark.svg',
|
||||
manual: [
|
||||
{ kind: 'text', content: 'Add the remote MCP server with the Codex CLI:' },
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'Terminal',
|
||||
code: `codex mcp add algolia-docsearch --url ${ENDPOINT}`,
|
||||
},
|
||||
{
|
||||
kind: 'text',
|
||||
content: 'Or add the same URL under [mcp_servers.algolia-docsearch] in ~/.codex/config.toml.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'chatgpt',
|
||||
name: 'ChatGPT',
|
||||
blurb: 'Custom connector',
|
||||
logo: 'chatgpt.svg',
|
||||
logoDark: 'chatgpt_dark.svg',
|
||||
manual: [
|
||||
{
|
||||
kind: 'steps',
|
||||
items: [
|
||||
'Open Settings -> Connectors.',
|
||||
'Enable Developer Mode if your workspace requires it.',
|
||||
'Create a custom connector named Algolia DocSearch.',
|
||||
'Paste the MCP endpoint shown above as the server URL and choose No Auth.',
|
||||
],
|
||||
},
|
||||
{ kind: 'note', content: 'Custom connector availability depends on your ChatGPT plan and workspace settings.' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'opencode',
|
||||
name: 'OpenCode',
|
||||
blurb: 'Remote MCP',
|
||||
logo: 'opencode.svg',
|
||||
logoDark: 'opencode_dark.svg',
|
||||
manual: [
|
||||
{ kind: 'text', content: 'Add a remote MCP entry to your OpenCode config:' },
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'opencode.json',
|
||||
code: `{
|
||||
"$schema": "https://opencode.ai/config.json",
|
||||
"mcp": {
|
||||
"algolia-docsearch": {
|
||||
"type": "remote",
|
||||
"url": "${ENDPOINT}",
|
||||
"enabled": true
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'pi',
|
||||
name: 'Pi',
|
||||
blurb: 'Extension required',
|
||||
logo: 'pi.svg',
|
||||
manual: [
|
||||
{
|
||||
kind: 'text',
|
||||
content:
|
||||
'Pi does not include MCP support by default. Install an MCP extension or adapter first, then add the DocSearch server:',
|
||||
},
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'Terminal',
|
||||
code: 'pi install npm:pi-mcp-adapter',
|
||||
},
|
||||
{
|
||||
kind: 'code',
|
||||
caption: '.mcp.json',
|
||||
code: `{
|
||||
"mcpServers": {
|
||||
"algolia-docsearch": {
|
||||
"url": "${ENDPOINT}"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'vscode',
|
||||
name: 'VS Code',
|
||||
blurb: 'Copilot agent',
|
||||
logo: 'vscode.svg',
|
||||
manual: [
|
||||
{
|
||||
kind: 'text',
|
||||
content:
|
||||
'Add a remote server in .vscode/mcp.json (workspace) or your user config. VS Code uses the servers key.',
|
||||
},
|
||||
{
|
||||
kind: 'code',
|
||||
caption: '.vscode/mcp.json',
|
||||
code: `{
|
||||
"servers": {
|
||||
"algolia-docsearch": {
|
||||
"type": "http",
|
||||
"url": "${ENDPOINT}"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
{ kind: 'note', content: 'DocSearch tools become available in Copilot Chat agent mode.' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'windsurf',
|
||||
name: 'Windsurf',
|
||||
blurb: 'Cascade',
|
||||
logo: 'windsurf.svg',
|
||||
logoDark: 'windsurf_dark.svg',
|
||||
manual: [
|
||||
{
|
||||
kind: 'text',
|
||||
content: 'Edit ~/.codeium/windsurf/mcp_config.json. Windsurf uses serverUrl for remote servers.',
|
||||
},
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'mcp_config.json',
|
||||
code: `{
|
||||
"mcpServers": {
|
||||
"algolia-docsearch": {
|
||||
"serverUrl": "${ENDPOINT}"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
{ kind: 'note', content: 'Restart Windsurf after saving.' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'zed',
|
||||
name: 'Zed',
|
||||
blurb: 'Context server',
|
||||
logo: 'zed.svg',
|
||||
logoDark: 'zed_dark.svg',
|
||||
manual: [
|
||||
{ kind: 'text', content: 'Add a context server in settings.json. Zed uses the context_servers key.' },
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'settings.json',
|
||||
code: `{
|
||||
"context_servers": {
|
||||
"algolia-docsearch": {
|
||||
"url": "${ENDPOINT}"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'conductor',
|
||||
name: 'Conductor',
|
||||
blurb: 'Agent host config',
|
||||
logo: 'conductor.svg',
|
||||
logoDark: 'conductor_dark.svg',
|
||||
manual: [
|
||||
{
|
||||
kind: 'text',
|
||||
content:
|
||||
'Conductor loads MCP servers from the selected agent host. Configure DocSearch in Claude Code, Codex, or Cursor, then start a Conductor session with that host.',
|
||||
},
|
||||
{
|
||||
kind: 'note',
|
||||
content:
|
||||
'There is no separate Conductor MCP config for normal Claude Code, Codex, or Cursor Composer sessions.',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'antigravity',
|
||||
name: 'Antigravity',
|
||||
blurb: 'Google agent',
|
||||
logo: 'antigravity.svg',
|
||||
manual: [
|
||||
{ kind: 'text', content: 'Open Manage MCP Servers -> View raw config, then add:' },
|
||||
{
|
||||
kind: 'code',
|
||||
caption: '~/.gemini/config/mcp_config.json',
|
||||
code: `{
|
||||
"mcpServers": {
|
||||
"algolia-docsearch": {
|
||||
"serverUrl": "${ENDPOINT}"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
{ kind: 'note', content: 'Save and refresh the Installed MCP Servers list.' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'other',
|
||||
name: 'Other clients',
|
||||
blurb: 'Any MCP host',
|
||||
icon: 'code',
|
||||
manual: [
|
||||
{
|
||||
kind: 'text',
|
||||
content: 'Most clients that support remote HTTP MCP servers accept this shape. Keep the name and URL:',
|
||||
},
|
||||
{
|
||||
kind: 'code',
|
||||
caption: 'MCP config',
|
||||
code: `{
|
||||
"mcpServers": {
|
||||
"algolia-docsearch": {
|
||||
"type": "http",
|
||||
"url": "${ENDPOINT}"
|
||||
}
|
||||
}
|
||||
}`,
|
||||
},
|
||||
{
|
||||
kind: 'note',
|
||||
content:
|
||||
'If your client uses a different key (servers, context_servers) or field (serverUrl), follow its MCP docs.',
|
||||
},
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
function CopyButton({ value, className = '' }) {
|
||||
const [copied, setCopied] = useState(false);
|
||||
|
||||
const onCopy = useCallback(() => {
|
||||
if (typeof navigator === 'undefined' || !navigator.clipboard) return;
|
||||
navigator.clipboard.writeText(value).then(() => {
|
||||
setCopied(true);
|
||||
setTimeout(() => setCopied(false), 1500);
|
||||
});
|
||||
}, [value]);
|
||||
|
||||
return (
|
||||
<motion.button
|
||||
type="button"
|
||||
aria-label="Copy to clipboard"
|
||||
whileTap={{ scale: 0.9 }}
|
||||
transition={SPRING}
|
||||
className={`cursor-pointer rounded-md px-2.5 py-1 text-xs font-medium ring-1 transition-colors ${
|
||||
copied
|
||||
? 'bg-blue-600 text-white ring-blue-600'
|
||||
: 'bg-white/80 text-neutral-600 ring-neutral-300 hover:bg-white dark:bg-neutral-800 dark:text-neutral-300 dark:ring-neutral-600 dark:hover:bg-neutral-700'
|
||||
} ${className}`}
|
||||
onClick={onCopy}
|
||||
>
|
||||
<AnimatePresence mode="wait" initial={false}>
|
||||
<motion.span
|
||||
key={copied ? 'copied' : 'copy'}
|
||||
initial={{ opacity: 0, y: 4 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
exit={{ opacity: 0, y: -4 }}
|
||||
transition={{ duration: 0.08 }}
|
||||
className="inline-block"
|
||||
>
|
||||
{copied ? 'Copied' : 'Copy'}
|
||||
</motion.span>
|
||||
</AnimatePresence>
|
||||
</motion.button>
|
||||
);
|
||||
}
|
||||
|
||||
function CodeCard({ caption, code }) {
|
||||
return (
|
||||
<div className="overflow-hidden rounded-xl ring-1 ring-neutral-200 dark:ring-neutral-700">
|
||||
<div className="flex items-center justify-between gap-3 border-b border-neutral-200 bg-neutral-50 px-4 py-2 dark:border-neutral-700 dark:bg-neutral-800/60">
|
||||
<span className="font-mono text-xs text-neutral-500 dark:text-neutral-400">{caption}</span>
|
||||
<CopyButton value={code} />
|
||||
</div>
|
||||
<pre className="m-0 overflow-x-auto bg-neutral-900 p-4 text-[13px] leading-relaxed text-neutral-100">
|
||||
<code className="bg-transparent! p-0! text-inherit!">{code}</code>
|
||||
</pre>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function CursorInstallButton({ href, label }) {
|
||||
return (
|
||||
<motion.a
|
||||
href={href}
|
||||
whileHover={{ y: -1 }}
|
||||
whileTap={{ scale: 0.98 }}
|
||||
transition={SPRING}
|
||||
className="inline-flex w-fit no-underline!"
|
||||
>
|
||||
<img
|
||||
src="https://cursor.com/deeplink/mcp-install-dark.svg"
|
||||
alt={label}
|
||||
height="32"
|
||||
className="block dark:hidden"
|
||||
/>
|
||||
<img
|
||||
src="https://cursor.com/deeplink/mcp-install-light.svg"
|
||||
alt={label}
|
||||
height="32"
|
||||
className="hidden dark:block"
|
||||
/>
|
||||
</motion.a>
|
||||
);
|
||||
}
|
||||
|
||||
function getBlockKey(block) {
|
||||
switch (block.kind) {
|
||||
case 'code':
|
||||
return `${block.kind}-${block.caption}`;
|
||||
case 'text':
|
||||
case 'note':
|
||||
case 'subhead':
|
||||
return `${block.kind}-${block.content}`;
|
||||
case 'installButton':
|
||||
case 'button':
|
||||
return `${block.kind}-${block.label}-${block.href}`;
|
||||
case 'steps':
|
||||
return `${block.kind}-${block.items.join('|')}`;
|
||||
default:
|
||||
return block.kind;
|
||||
}
|
||||
}
|
||||
|
||||
function Block({ block }) {
|
||||
switch (block.kind) {
|
||||
case 'subhead':
|
||||
return (
|
||||
<div className="flex items-center gap-3 pt-1">
|
||||
<span className="text-xs font-semibold tracking-wide text-neutral-700 uppercase dark:text-neutral-200">
|
||||
{block.content}
|
||||
</span>
|
||||
<span className="h-px flex-1 bg-neutral-200 dark:bg-neutral-700" />
|
||||
</div>
|
||||
);
|
||||
case 'text':
|
||||
return <p className="my-0 text-sm leading-relaxed text-neutral-600 dark:text-neutral-300">{block.content}</p>;
|
||||
case 'note':
|
||||
return (
|
||||
<p className="my-0 rounded-lg bg-blue-50 px-3 py-2 text-sm text-blue-900 ring-1 ring-blue-100 dark:bg-blue-950/40 dark:text-blue-200 dark:ring-blue-900/60">
|
||||
{block.content}
|
||||
</p>
|
||||
);
|
||||
case 'code':
|
||||
return <CodeCard caption={block.caption} code={block.code} />;
|
||||
case 'steps':
|
||||
return (
|
||||
<ol className="my-0 flex list-none flex-col gap-2 pl-0">
|
||||
{block.items.map((item, idx) => (
|
||||
<li key={item} className="flex items-start gap-3 text-sm text-neutral-600 dark:text-neutral-300">
|
||||
<span className="mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-blue-600 text-[11px] font-semibold text-white">
|
||||
{idx + 1}
|
||||
</span>
|
||||
<span>{item}</span>
|
||||
</li>
|
||||
))}
|
||||
</ol>
|
||||
);
|
||||
case 'button':
|
||||
return (
|
||||
<motion.a
|
||||
href={block.href}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
whileHover={{ scale: 1.02 }}
|
||||
whileTap={{ scale: 0.97 }}
|
||||
transition={SPRING}
|
||||
className="inline-flex w-fit items-center gap-2 rounded-lg bg-blue-600 px-4 py-2 text-sm font-semibold text-white! no-underline! transition-colors hover:bg-blue-700"
|
||||
>
|
||||
{block.label}
|
||||
</motion.a>
|
||||
);
|
||||
case 'installButton':
|
||||
return <CursorInstallButton href={block.href} label={block.label} />;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function ClientLogo({ client, size = 'h-7 w-7' }) {
|
||||
const single = useBaseUrl(`/img/mcp-clients/${client.icon ?? client.logo}`);
|
||||
const dark = useBaseUrl(`/img/mcp-clients/${client.logoDark ?? client.logo}`);
|
||||
const hasDark = Boolean(client.logoDark);
|
||||
|
||||
if (client.icon === 'code') {
|
||||
return (
|
||||
<span
|
||||
className={`${size} flex items-center justify-center rounded-md bg-neutral-100 text-neutral-700 dark:bg-neutral-800 dark:text-neutral-200`}
|
||||
>
|
||||
<Code2 aria-label={`${client.name} icon`} className="h-[70%] w-[70%]" />
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
if (!hasDark) {
|
||||
return <img src={single} alt={`${client.name} logo`} className={`${size} object-contain`} />;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
<img src={single} alt={`${client.name} logo`} className={`${size} object-contain block dark:hidden`} />
|
||||
<img aria-hidden={true} src={dark} alt="" className={`${size} object-contain hidden dark:block`} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default function MCPInstall() {
|
||||
const [selectedId, setSelectedId] = useState(CLIENTS[0].id);
|
||||
const [mode, setMode] = useState('plugin');
|
||||
const reduce = useReducedMotion();
|
||||
|
||||
const selected = CLIENTS.find((client) => client.id === selectedId) ?? CLIENTS[0];
|
||||
const hasPlugin = Array.isArray(selected.plugin);
|
||||
const activeMode = hasPlugin ? mode : 'manual';
|
||||
const blocks = activeMode === 'plugin' ? selected.plugin : selected.manual;
|
||||
|
||||
const rise = reduce ? 0 : 10;
|
||||
const cardRise = reduce ? 0 : 8;
|
||||
|
||||
function selectClient(id) {
|
||||
setSelectedId(id);
|
||||
setMode('plugin');
|
||||
}
|
||||
|
||||
return (
|
||||
<motion.div
|
||||
id="tailwind"
|
||||
className="not-prose my-8 font-[Inter]"
|
||||
initial={{ opacity: 0, y: rise }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true, amount: 0.15 }}
|
||||
transition={{ duration: 0.22, ease: 'easeOut' }}
|
||||
>
|
||||
<div className="overflow-hidden rounded-2xl ring-1 ring-neutral-200 dark:ring-neutral-700">
|
||||
{/* Header */}
|
||||
<div className="flex flex-col gap-4 border-b border-neutral-200 bg-gradient-to-b from-blue-50 to-white px-6 py-5 dark:border-neutral-700 dark:from-neutral-800 dark:to-neutral-900">
|
||||
<div className="flex items-center gap-3">
|
||||
<div>
|
||||
<p className="font-[Sora] !mb-0 text-xl font-semibold whitespace-nowrap text-neutral-900 dark:text-white">
|
||||
Connect DocSearch MCP
|
||||
</p>
|
||||
<p className="my-0 text-sm text-neutral-500 dark:text-neutral-400">
|
||||
Pick your client to get the install steps
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Client picker */}
|
||||
<motion.div
|
||||
className="grid grid-cols-2 gap-2 p-4 sm:grid-cols-6"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={{ once: true, amount: 0.1 }}
|
||||
variants={{ hidden: {}, show: { transition: { staggerChildren: 0.018, delayChildren: 0.02 } } }}
|
||||
>
|
||||
{CLIENTS.map((client) => {
|
||||
const isActive = client.id === selectedId;
|
||||
return (
|
||||
<motion.button
|
||||
key={client.id}
|
||||
type="button"
|
||||
variants={{ hidden: { opacity: 0, y: cardRise }, show: { opacity: 1, y: 0 } }}
|
||||
whileHover={reduce ? undefined : { y: -3 }}
|
||||
whileTap={{ scale: 0.96 }}
|
||||
transition={SPRING}
|
||||
className="group relative flex cursor-pointer flex-col items-center gap-2 rounded-xl px-3 py-4 text-center ring-1 ring-neutral-200 transition-colors hover:ring-neutral-300 dark:ring-neutral-700 dark:hover:ring-neutral-600"
|
||||
onClick={() => selectClient(client.id)}
|
||||
>
|
||||
{isActive && (
|
||||
<motion.span
|
||||
layoutId="mcp-active-card"
|
||||
className="absolute inset-0 rounded-xl bg-blue-50 ring-2 ring-blue-500 dark:bg-blue-950/40"
|
||||
transition={SPRING}
|
||||
/>
|
||||
)}
|
||||
<span className="relative z-10 flex flex-col items-center gap-2">
|
||||
<ClientLogo client={client} />
|
||||
<span className="text-xs font-semibold text-neutral-800 dark:text-neutral-100">{client.name}</span>
|
||||
</span>
|
||||
</motion.button>
|
||||
);
|
||||
})}
|
||||
</motion.div>
|
||||
|
||||
{/* Detail panel */}
|
||||
<div className="border-t border-neutral-200 px-6 py-5 dark:border-neutral-700">
|
||||
<div className="mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
||||
<AnimatePresence mode="wait" initial={false}>
|
||||
<motion.div
|
||||
key={selectedId}
|
||||
initial={{ opacity: 0, x: reduce ? 0 : -6 }}
|
||||
animate={{ opacity: 1, x: 0 }}
|
||||
exit={{ opacity: 0, x: reduce ? 0 : 6 }}
|
||||
transition={{ duration: 0.1 }}
|
||||
className="flex items-center gap-3"
|
||||
>
|
||||
<ClientLogo client={selected} size="h-6 w-6" />
|
||||
<span className="font-[Sora] text-sm font-semibold text-neutral-900 dark:text-white">
|
||||
{selected.name}
|
||||
</span>
|
||||
<span className="text-xs text-neutral-400 dark:text-neutral-500">{selected.blurb}</span>
|
||||
</motion.div>
|
||||
</AnimatePresence>
|
||||
|
||||
{hasPlugin && (
|
||||
<div className="inline-flex rounded-lg bg-neutral-100 p-1 ring-1 ring-neutral-200 dark:bg-neutral-800 dark:ring-neutral-700">
|
||||
{['plugin', 'manual'].map((value) => {
|
||||
const isActive = activeMode === value;
|
||||
return (
|
||||
<button
|
||||
key={value}
|
||||
type="button"
|
||||
className={`relative cursor-pointer rounded-md px-3 py-1 text-xs font-semibold capitalize transition-colors ${
|
||||
isActive
|
||||
? 'text-blue-700 dark:text-blue-300'
|
||||
: 'text-neutral-500 hover:text-neutral-700 dark:text-neutral-400 dark:hover:text-neutral-200'
|
||||
}`}
|
||||
onClick={() => setMode(value)}
|
||||
>
|
||||
{isActive && (
|
||||
<motion.span
|
||||
layoutId="mcp-mode-pill"
|
||||
className="absolute inset-0 rounded-md bg-white shadow-sm dark:bg-neutral-900"
|
||||
transition={SPRING}
|
||||
/>
|
||||
)}
|
||||
<span className="relative z-10">{value}</span>
|
||||
</button>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<AnimatePresence mode="wait">
|
||||
<motion.div
|
||||
key={`${selectedId}-${activeMode}`}
|
||||
initial="hidden"
|
||||
animate="show"
|
||||
exit="exit"
|
||||
variants={{
|
||||
hidden: { opacity: 0, y: reduce ? 0 : 6 },
|
||||
show: { opacity: 1, y: 0, transition: { duration: 0.13, staggerChildren: 0.02 } },
|
||||
exit: { opacity: 0, y: reduce ? 0 : -6, transition: { duration: 0.08 } },
|
||||
}}
|
||||
className="flex flex-col gap-3"
|
||||
>
|
||||
{blocks.map((block) => (
|
||||
<motion.div
|
||||
key={`${selectedId}-${activeMode}-${getBlockKey(block)}`}
|
||||
variants={{ hidden: { opacity: 0, y: reduce ? 0 : 4 }, show: { opacity: 1, y: 0 } }}
|
||||
>
|
||||
<Block block={block} />
|
||||
</motion.div>
|
||||
))}
|
||||
</motion.div>
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
</div>
|
||||
</motion.div>
|
||||
);
|
||||
}
|
||||
1
packages/website/static/img/docsearch-monogram.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-10 -10 96 98"><path fill="#5468ff" d="M36.493 77.289H3.074A3.067 3.067 0 0 1 0 74.228h36.523c12.769.062 24.6-6.663 31.038-17.642a35.45 35.45 0 0 0 .174-35.584C61.404 9.962 49.639 3.122 36.87 3.061H0A3.067 3.067 0 0 1 3.074 0H36.87c10.31.01 20.193 4.1 27.473 11.369a38.6 38.6 0 0 1 11.341 27.384c-.06 21.366-17.741 38.536-39.19 38.536z"/><path fill="#5468ff" d="M0 69.045h23.711a11.78 11.78 0 0 0 7.933-3.031H0zM0 60.8h36.374c.734-.987 1.418-1.975 2.053-3.07H0zm0-8.254h41.025a30 30 0 0 0 1.091-3.06H0zm0-8.244h43.306c.149-.987.268-2.034.337-3.061H0zm0-8.244h43.633a30 30 0 0 1-.337-3.071H0zm0-8.254h42.116a36 36 0 0 0-1.09-3.061H0zm0-8.245h38.427a33 33 0 0 1-2.053-3.06H0zM0 8.244v3.071h31.674a19.04 19.04 0 0 0-7.934-3.031z"/></svg>
|
||||
|
After Width: | Height: | Size: 784 B |
1
packages/website/static/img/mcp-clients/algolia.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg width="250" height="250" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M124.997 0C56.683 0 .997 55.037.013 123.075-.99 192.166 55.11 249.424 124.26 249.817c21.362.128 41.927-5.091 60.191-15.017 1.78-.963 2.055-3.411.541-4.757l-11.694-10.359c-2.38-2.103-5.764-2.702-8.685-1.454-12.746 5.425-26.603 8.186-40.884 8.019-55.873-.688-101.025-47.144-100.13-102.977.875-55.125 46.028-99.705 101.399-99.705h101.419v180.127l-57.535-51.085c-1.859-1.652-4.711-1.327-6.216.658-9.235 12.216-24.283 19.823-40.992 18.663-23.182-1.602-41.966-20.245-43.697-43.4-2.076-27.617 19.827-50.752 47.031-50.752 24.607 0 44.867 18.93 46.981 42.978.187 2.143 1.151 4.138 2.764 5.563l14.989 13.277c1.701 1.504 4.396.58 4.819-1.651a71.016 71.016 0 0 0 1.033-17.955c-2.41-35.165-30.922-63.46-66.131-65.632-40.363-2.486-74.117 29.072-75.189 68.629-1.043 38.545 30.557 71.774 69.14 72.629 16.11.353 31.03-4.708 43.098-13.474l75.178 66.594c3.226 2.85 8.311.57 8.311-3.735V4.737A4.741 4.741 0 0 0 245.259 0H124.997Z" fill="#003DFF"/></svg>
|
||||
|
After Width: | Height: | Size: 1,020 B |
97
packages/website/static/img/mcp-clients/antigravity.svg
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
<svg width="16" height="15" viewBox="0 0 16 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<mask id="mask0_111_52" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="16" height="15">
|
||||
<path d="M14.0777 13.984C14.945 14.6345 16.2458 14.2008 15.0533 13.0084C11.476 9.53949 12.2349 0 7.79033 0C3.34579 0 4.10461 9.53949 0.527295 13.0084C-0.773543 14.3092 0.635692 14.6345 1.50293 13.984C4.86344 11.7076 4.64663 7.69664 7.79033 7.69664C10.934 7.69664 10.7172 11.7076 14.0777 13.984Z" fill="black"/>
|
||||
</mask>
|
||||
<g mask="url(#mask0_111_52)">
|
||||
<g filter="url(#filter0_f_111_52)">
|
||||
<path d="M-0.658907 -3.2306C-0.922679 -0.906781 1.07986 1.22861 3.81388 1.53894C6.54791 1.84927 8.97811 0.217009 9.24188 -2.10681C9.50565 -4.43063 7.50312 -6.56602 4.76909 -6.87635C2.03506 -7.18667 -0.395135 -5.55442 -0.658907 -3.2306Z" fill="#FFE432"/>
|
||||
</g>
|
||||
<g filter="url(#filter1_f_111_52)">
|
||||
<path d="M9.88233 4.36642C10.5673 7.31568 13.566 9.13902 16.5801 8.43896C19.5942 7.73891 21.4823 4.78056 20.7973 1.83131C20.1123 -1.11795 17.1136 -2.94128 14.0995 -2.24123C11.0854 -1.54118 9.19733 1.41717 9.88233 4.36642Z" fill="#FC413D"/>
|
||||
</g>
|
||||
<g filter="url(#filter2_f_111_52)">
|
||||
<path d="M-8.05291 6.34512C-7.18736 9.38883 -3.28925 10.9473 0.653774 9.82598C4.5968 8.7047 7.09158 5.32829 6.22603 2.28458C5.36048 -0.759142 1.46236 -2.31758 -2.48066 -1.19629C-6.42368 -0.0750048 -8.91846 3.3014 -8.05291 6.34512Z" fill="#00B95C"/>
|
||||
</g>
|
||||
<g filter="url(#filter3_f_111_52)">
|
||||
<path d="M-8.05291 6.34512C-7.18736 9.38883 -3.28925 10.9473 0.653774 9.82598C4.5968 8.7047 7.09158 5.32829 6.22603 2.28458C5.36048 -0.759142 1.46236 -2.31758 -2.48066 -1.19629C-6.42368 -0.0750048 -8.91846 3.3014 -8.05291 6.34512Z" fill="#00B95C"/>
|
||||
</g>
|
||||
<g filter="url(#filter4_f_111_52)">
|
||||
<path d="M-4.92402 8.86746C-2.75421 11.0837 0.982691 10.9438 3.42257 8.55507C5.86246 6.1663 6.08139 2.43321 3.91158 0.216963C1.74177 -1.99928 -1.99513 -1.85942 -4.43501 0.529349C-6.87489 2.91812 -7.09383 6.65122 -4.92402 8.86746Z" fill="#00B95C"/>
|
||||
</g>
|
||||
<g filter="url(#filter5_f_111_52)">
|
||||
<path d="M6.42819 17.2263C7.10197 20.1273 9.91278 21.953 12.7063 21.3042C15.4998 20.6553 17.2182 17.7777 16.5444 14.8767C15.8707 11.9757 13.0599 10.15 10.2663 10.7988C7.47281 11.4477 5.75441 14.3253 6.42819 17.2263Z" fill="#3186FF"/>
|
||||
</g>
|
||||
<g filter="url(#filter6_f_111_52)">
|
||||
<path d="M1.66508 -5.94539C0.254213 -2.80254 1.7978 0.951609 5.11277 2.43973C8.42774 3.92785 12.2588 2.58642 13.6696 -0.556431C15.0805 -3.69928 13.5369 -7.45343 10.222 -8.94155C6.90699 -10.4297 3.07594 -9.08824 1.66508 -5.94539Z" fill="#FBBC04"/>
|
||||
</g>
|
||||
<g filter="url(#filter7_f_111_52)">
|
||||
<path d="M-2.11428 24.3903C-5.52984 23.0496 0.307266 12.0177 1.75874 8.32038C3.21024 4.62304 7.15576 2.71272 10.5713 4.05357C13.9869 5.39442 18.0354 12.7796 16.5838 16.477C15.1323 20.1743 1.30129 25.7311 -2.11428 24.3903Z" fill="#3186FF"/>
|
||||
</g>
|
||||
<g filter="url(#filter8_f_111_52)">
|
||||
<path d="M18.5814 10.6598C17.6669 11.727 15.2806 11.1828 13.2514 9.44417C11.2222 7.70556 10.3185 5.43097 11.2329 4.3637C12.1473 3.29646 14.5336 3.84069 16.5628 5.57928C18.592 7.31789 19.4958 9.59249 18.5814 10.6598Z" fill="#749BFF"/>
|
||||
</g>
|
||||
<g filter="url(#filter9_f_111_52)">
|
||||
<path d="M11.7552 5.22715C15.5162 7.77124 19.8471 7.93838 21.4286 5.60045C23.0101 3.26253 21.2433 -0.695128 17.4823 -3.23922C13.7213 -5.78331 9.39044 -5.95044 7.80896 -3.61252C6.22747 -1.27459 7.99428 2.68306 11.7552 5.22715Z" fill="#FC413D"/>
|
||||
</g>
|
||||
<g filter="url(#filter10_f_111_52)">
|
||||
<path d="M-0.592149 1.08896C-1.5239 3.33663 -1.21959 5.59799 0.0875457 6.13985C1.39468 6.68171 3.20966 5.29888 4.14141 3.05121C5.07316 0.803541 4.76885 -1.45782 3.46171 -1.99968C2.15458 -2.54154 0.339602 -1.15871 -0.592149 1.08896Z" fill="#FFEE48"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_f_111_52" x="-2.12817" y="-8.35998" width="12.8393" height="11.383" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="0.722959" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter1_f_111_52" x="2.75168" y="-9.38089" width="25.1763" height="24.96" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="3.49513" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter2_f_111_52" x="-14.1669" y="-7.50196" width="26.5068" height="23.6338" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.97119" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter3_f_111_52" x="-14.1669" y="-7.50196" width="26.5068" height="23.6338" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.97119" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter4_f_111_52" x="-12.3607" y="-7.29981" width="23.709" height="23.6846" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.97119" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter5_f_111_52" x="0.634962" y="5.02095" width="21.7027" height="22.0616" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.82351" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter6_f_111_52" x="-3.97547" y="-14.6666" width="23.2857" height="22.8313" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.5589" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter7_f_111_52" x="-7.7407" y="-0.945408" width="29.1982" height="30.1105" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.2852" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter8_f_111_52" x="6.78641" y="-0.27231" width="16.2415" height="15.5681" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.04485" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter9_f_111_52" x="3.77526" y="-8.71693" width="21.687" height="19.4212" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="1.72712" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
<filter id="filter10_f_111_52" x="-5.40727" y="-6.39238" width="14.3639" height="16.9254" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="2.1376" result="effect1_foregroundBlur_111_52"/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.8 KiB |
1
packages/website/static/img/mcp-clients/chatgpt.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="260" preserveAspectRatio="xMidYMid" viewBox="0 0 256 260"><path d="M239.184 106.203a64.716 64.716 0 0 0-5.576-53.103C219.452 28.459 191 15.784 163.213 21.74A65.586 65.586 0 0 0 52.096 45.22a64.716 64.716 0 0 0-43.23 31.36c-14.31 24.602-11.061 55.634 8.033 76.74a64.665 64.665 0 0 0 5.525 53.102c14.174 24.65 42.644 37.324 70.446 31.36a64.72 64.72 0 0 0 48.754 21.744c28.481.025 53.714-18.361 62.414-45.481a64.767 64.767 0 0 0 43.229-31.36c14.137-24.558 10.875-55.423-8.083-76.483Zm-97.56 136.338a48.397 48.397 0 0 1-31.105-11.255l1.535-.87 51.67-29.825a8.595 8.595 0 0 0 4.247-7.367v-72.85l21.845 12.636c.218.111.37.32.409.563v60.367c-.056 26.818-21.783 48.545-48.601 48.601Zm-104.466-44.61a48.345 48.345 0 0 1-5.781-32.589l1.534.921 51.722 29.826a8.339 8.339 0 0 0 8.441 0l63.181-36.425v25.221a.87.87 0 0 1-.358.665l-52.335 30.184c-23.257 13.398-52.97 5.431-66.404-17.803ZM23.549 85.38a48.499 48.499 0 0 1 25.58-21.333v61.39a8.288 8.288 0 0 0 4.195 7.316l62.874 36.272-21.845 12.636a.819.819 0 0 1-.767 0L41.353 151.53c-23.211-13.454-31.171-43.144-17.804-66.405v.256Zm179.466 41.695-63.08-36.63L161.73 77.86a.819.819 0 0 1 .768 0l52.233 30.184a48.6 48.6 0 0 1-7.316 87.635v-61.391a8.544 8.544 0 0 0-4.4-7.213Zm21.742-32.69-1.535-.922-51.619-30.081a8.39 8.39 0 0 0-8.492 0L99.98 99.808V74.587a.716.716 0 0 1 .307-.665l52.233-30.133a48.652 48.652 0 0 1 72.236 50.391v.205ZM88.061 139.097l-21.845-12.585a.87.87 0 0 1-.41-.614V65.685a48.652 48.652 0 0 1 79.757-37.346l-1.535.87-51.67 29.825a8.595 8.595 0 0 0-4.246 7.367l-.051 72.697Zm11.868-25.58 28.138-16.217 28.188 16.218v32.434l-28.086 16.218-28.188-16.218-.052-32.434Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
1
packages/website/static/img/mcp-clients/chatgpt_dark.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="260" preserveAspectRatio="xMidYMid" viewBox="0 0 256 260"><path fill="#fff" d="M239.184 106.203a64.716 64.716 0 0 0-5.576-53.103C219.452 28.459 191 15.784 163.213 21.74A65.586 65.586 0 0 0 52.096 45.22a64.716 64.716 0 0 0-43.23 31.36c-14.31 24.602-11.061 55.634 8.033 76.74a64.665 64.665 0 0 0 5.525 53.102c14.174 24.65 42.644 37.324 70.446 31.36a64.72 64.72 0 0 0 48.754 21.744c28.481.025 53.714-18.361 62.414-45.481a64.767 64.767 0 0 0 43.229-31.36c14.137-24.558 10.875-55.423-8.083-76.483Zm-97.56 136.338a48.397 48.397 0 0 1-31.105-11.255l1.535-.87 51.67-29.825a8.595 8.595 0 0 0 4.247-7.367v-72.85l21.845 12.636c.218.111.37.32.409.563v60.367c-.056 26.818-21.783 48.545-48.601 48.601Zm-104.466-44.61a48.345 48.345 0 0 1-5.781-32.589l1.534.921 51.722 29.826a8.339 8.339 0 0 0 8.441 0l63.181-36.425v25.221a.87.87 0 0 1-.358.665l-52.335 30.184c-23.257 13.398-52.97 5.431-66.404-17.803ZM23.549 85.38a48.499 48.499 0 0 1 25.58-21.333v61.39a8.288 8.288 0 0 0 4.195 7.316l62.874 36.272-21.845 12.636a.819.819 0 0 1-.767 0L41.353 151.53c-23.211-13.454-31.171-43.144-17.804-66.405v.256Zm179.466 41.695-63.08-36.63L161.73 77.86a.819.819 0 0 1 .768 0l52.233 30.184a48.6 48.6 0 0 1-7.316 87.635v-61.391a8.544 8.544 0 0 0-4.4-7.213Zm21.742-32.69-1.535-.922-51.619-30.081a8.39 8.39 0 0 0-8.492 0L99.98 99.808V74.587a.716.716 0 0 1 .307-.665l52.233-30.133a48.652 48.652 0 0 1 72.236 50.391v.205ZM88.061 139.097l-21.845-12.585a.87.87 0 0 1-.41-.614V65.685a48.652 48.652 0 0 1 79.757-37.346l-1.535.87-51.67 29.825a8.595 8.595 0 0 0-4.246 7.367l-.051 72.697Zm11.868-25.58 28.138-16.217 28.188 16.218v32.434l-28.086 16.218-28.188-16.218-.052-32.434Z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
1
packages/website/static/img/mcp-clients/claude.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="257" preserveAspectRatio="xMidYMid" viewBox="0 0 256 257"><path fill="#D97757" d="m50.228 170.321 50.357-28.257.843-2.463-.843-1.361h-2.462l-8.426-.518-28.775-.778-24.952-1.037-24.175-1.296-6.092-1.297L0 125.796l.583-3.759 5.12-3.434 7.324.648 16.202 1.101 24.304 1.685 17.629 1.037 26.118 2.722h4.148l.583-1.685-1.426-1.037-1.101-1.037-25.147-17.045-27.22-18.017-14.258-10.37-7.713-5.25-3.888-4.925-1.685-10.758 7-7.713 9.397.649 2.398.648 9.527 7.323 20.35 15.75L94.817 91.9l3.889 3.24 1.555-1.102.195-.777-1.75-2.917-14.453-26.118-15.425-26.572-6.87-11.018-1.814-6.61c-.648-2.723-1.102-4.991-1.102-7.778l7.972-10.823L71.42 0 82.05 1.426l4.472 3.888 6.61 15.101 10.694 23.786 16.591 32.34 4.861 9.592 2.592 8.879.973 2.722h1.685v-1.556l1.36-18.211 2.528-22.36 2.463-28.776.843-8.1 4.018-9.722 7.971-5.25 6.222 2.981 5.12 7.324-.713 4.73-3.046 19.768-5.962 30.98-3.889 20.739h2.268l2.593-2.593 10.499-13.934 17.628-22.036 7.778-8.749 9.073-9.657 5.833-4.601h11.018l8.1 12.055-3.628 12.443-11.342 14.388-9.398 12.184-13.48 18.147-8.426 14.518.778 1.166 2.01-.194 30.46-6.481 16.462-2.982 19.637-3.37 8.88 4.148.971 4.213-3.5 8.62-20.998 5.184-24.628 4.926-36.682 8.685-.454.324.519.648 16.526 1.555 7.065.389h17.304l32.21 2.398 8.426 5.574 5.055 6.805-.843 5.184-12.962 6.611-17.498-4.148-40.83-9.721-14-3.5h-1.944v1.167l11.666 11.406 21.387 19.314 26.767 24.887 1.36 6.157-3.434 4.86-3.63-.518-23.526-17.693-9.073-7.972-20.545-17.304h-1.36v1.814l4.73 6.935 25.017 37.59 1.296 11.536-1.814 3.76-6.481 2.268-7.13-1.297-14.647-20.544-15.1-23.138-12.185-20.739-1.49.843-7.194 77.448-3.37 3.953-7.778 2.981-6.48-4.925-3.436-7.972 3.435-15.749 4.148-20.544 3.37-16.333 3.046-20.285 1.815-6.74-.13-.454-1.49.194-15.295 20.999-23.267 31.433-18.406 19.702-4.407 1.75-7.648-3.954.713-7.064 4.277-6.286 25.47-32.405 15.36-20.092 9.917-11.6-.065-1.686h-.583L44.07 198.125l-12.055 1.555-5.185-4.86.648-7.972 2.463-2.593 20.35-13.999-.064.065Z"/></svg>
|
||||
|
After Width: | Height: | Size: 2 KiB |
1
packages/website/static/img/mcp-clients/codex.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg fill="#111" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Codex</title><path clip-rule="evenodd" d="M8.086.457a6.105 6.105 0 013.046-.415c1.333.153 2.521.72 3.564 1.7a.117.117 0 00.107.029c1.408-.346 2.762-.224 4.061.366l.063.03.154.076c1.357.703 2.33 1.77 2.918 3.198.278.679.418 1.388.421 2.126a5.655 5.655 0 01-.18 1.631.167.167 0 00.04.155 5.982 5.982 0 011.578 2.891c.385 1.901-.01 3.615-1.183 5.14l-.182.22a6.063 6.063 0 01-2.934 1.851.162.162 0 00-.108.102c-.255.736-.511 1.364-.987 1.992-1.199 1.582-2.962 2.462-4.948 2.451-1.583-.008-2.986-.587-4.21-1.736a.145.145 0 00-.14-.032c-.518.167-1.04.191-1.604.185a5.924 5.924 0 01-2.595-.622 6.058 6.058 0 01-2.146-1.781c-.203-.269-.404-.522-.551-.821a7.74 7.74 0 01-.495-1.283 6.11 6.11 0 01-.017-3.064.166.166 0 00.008-.074.115.115 0 00-.037-.064 5.958 5.958 0 01-1.38-2.202 5.196 5.196 0 01-.333-1.589 6.915 6.915 0 01.188-2.132c.45-1.484 1.309-2.648 2.577-3.493.282-.188.55-.334.802-.438.286-.12.573-.22.861-.304a.129.129 0 00.087-.087A6.016 6.016 0 015.635 2.31C6.315 1.464 7.132.846 8.086.457zm-.804 7.85a.848.848 0 00-1.473.842l1.694 2.965-1.688 2.848a.849.849 0 001.46.864l1.94-3.272a.849.849 0 00.007-.854l-1.94-3.393zm5.446 6.24a.849.849 0 000 1.695h4.848a.849.849 0 000-1.696h-4.848z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
1
packages/website/static/img/mcp-clients/codex_dark.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg fill="#fff" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Codex</title><path clip-rule="evenodd" d="M8.086.457a6.105 6.105 0 013.046-.415c1.333.153 2.521.72 3.564 1.7a.117.117 0 00.107.029c1.408-.346 2.762-.224 4.061.366l.063.03.154.076c1.357.703 2.33 1.77 2.918 3.198.278.679.418 1.388.421 2.126a5.655 5.655 0 01-.18 1.631.167.167 0 00.04.155 5.982 5.982 0 011.578 2.891c.385 1.901-.01 3.615-1.183 5.14l-.182.22a6.063 6.063 0 01-2.934 1.851.162.162 0 00-.108.102c-.255.736-.511 1.364-.987 1.992-1.199 1.582-2.962 2.462-4.948 2.451-1.583-.008-2.986-.587-4.21-1.736a.145.145 0 00-.14-.032c-.518.167-1.04.191-1.604.185a5.924 5.924 0 01-2.595-.622 6.058 6.058 0 01-2.146-1.781c-.203-.269-.404-.522-.551-.821a7.74 7.74 0 01-.495-1.283 6.11 6.11 0 01-.017-3.064.166.166 0 00.008-.074.115.115 0 00-.037-.064 5.958 5.958 0 01-1.38-2.202 5.196 5.196 0 01-.333-1.589 6.915 6.915 0 01.188-2.132c.45-1.484 1.309-2.648 2.577-3.493.282-.188.55-.334.802-.438.286-.12.573-.22.861-.304a.129.129 0 00.087-.087A6.016 6.016 0 015.635 2.31C6.315 1.464 7.132.846 8.086.457zm-.804 7.85a.848.848 0 00-1.473.842l1.694 2.965-1.688 2.848a.849.849 0 001.46.864l1.94-3.272a.849.849 0 00.007-.854l-1.94-3.393zm5.446 6.24a.849.849 0 000 1.695h4.848a.849.849 0 000-1.696h-4.848z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
1
packages/website/static/img/mcp-clients/conductor.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 115 174" xmlns="http://www.w3.org/2000/svg"><g fill="#282423" stroke="#282423"><path d="M4.6 63.7H22.4V37.3H4.6C3.6 37.3 2.8 38.1 2.8 39V61.9C2.8 62.9 3.6 63.7 4.6 63.7Z"/><path d="M36.6 63.7H18.8V37.3H36.6C37.6 37.3 38.4 38.1 38.4 39V61.9C38.4 62.9 37.6 63.7 36.6 63.7Z"/><path d="M4.6 100.3H22.4V73.8H4.6C3.6 73.8 2.8 74.6 2.8 75.6V98.5C2.8 99.5 3.6 100.3 4.6 100.3Z"/><path d="M36.6 100.3H18.8V73.8H36.6C37.6 73.8 38.4 74.6 38.4 75.6V98.5C38.4 99.5 37.6 100.3 36.6 100.3Z"/><path d="M4.6 136.9H22.4V110.4H4.6C3.6 110.4 2.8 111.2 2.8 112.2V135.1C2.8 136.1 3.6 136.9 4.6 136.9Z"/><path d="M36.6 136.9H18.8V110.4H36.6C37.6 110.4 38.4 111.2 38.4 112.2V135.1C38.4 136.1 37.6 136.9 36.6 136.9Z"/><path d="M22.9 173.5H40.7V147H22.9C21.9 147 21.1 147.8 21.1 148.8V171.7C21.1 172.7 21.9 173.5 22.9 173.5Z"/><path d="M37.1 173.5V147H59V173.5H37.1Z"/><path d="M55.4 173.5V147H77.3V173.5H55.4Z"/><path d="M91.5 173.5H73.7V147H91.5C92.5 147 93.3 147.8 93.3 148.8V171.7C93.3 172.7 92.5 173.5 91.5 173.5Z"/><path d="M77.8 136.9H95.6V110.4H77.8C76.8 110.4 76 111.2 76 112.2V135.1C76 136.1 76.8 136.9 77.8 136.9Z"/><path d="M109.8 136.9H92V110.4H109.8C110.8 110.4 111.6 111.2 111.6 112.2V135.1C111.6 136.1 110.8 136.9 109.8 136.9Z"/><path d="M22.9 27.1H40.7V0.7H22.9C21.9 0.7 21.1 1.5 21.1 2.4V25.3C21.1 26.3 21.9 27.1 22.9 27.1Z"/><path d="M37.1 27.1V0.7H59V27.1H37.1Z"/><path d="M55.4 27.1V0.7H77.3V27.1H55.4Z"/><path d="M73.7 27.1V0.7H95.6V27.1H73.7Z"/><path d="M109.8 27.1H92V0.7H109.8C110.8 0.7 111.6 1.5 111.6 2.4V25.3C111.6 26.3 110.8 27.1 109.8 27.1Z"/><path d="M77.8 63.7H95.6V37.3H77.8C76.8 37.3 76 38.1 76 39V61.9C76 62.9 76.8 63.7 77.8 63.7Z"/><path d="M109.8 63.7H92V37.3H109.8C110.8 37.3 111.6 38.1 111.6 39V61.9C111.6 62.9 110.8 63.7 109.8 63.7Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg viewBox="0 0 115 174" xmlns="http://www.w3.org/2000/svg"><g fill="#fff" stroke="#fff"><path d="M4.6 63.7H22.4V37.3H4.6C3.6 37.3 2.8 38.1 2.8 39V61.9C2.8 62.9 3.6 63.7 4.6 63.7Z"/><path d="M36.6 63.7H18.8V37.3H36.6C37.6 37.3 38.4 38.1 38.4 39V61.9C38.4 62.9 37.6 63.7 36.6 63.7Z"/><path d="M4.6 100.3H22.4V73.8H4.6C3.6 73.8 2.8 74.6 2.8 75.6V98.5C2.8 99.5 3.6 100.3 4.6 100.3Z"/><path d="M36.6 100.3H18.8V73.8H36.6C37.6 73.8 38.4 74.6 38.4 75.6V98.5C38.4 99.5 37.6 100.3 36.6 100.3Z"/><path d="M4.6 136.9H22.4V110.4H4.6C3.6 110.4 2.8 111.2 2.8 112.2V135.1C2.8 136.1 3.6 136.9 4.6 136.9Z"/><path d="M36.6 136.9H18.8V110.4H36.6C37.6 110.4 38.4 111.2 38.4 112.2V135.1C38.4 136.1 37.6 136.9 36.6 136.9Z"/><path d="M22.9 173.5H40.7V147H22.9C21.9 147 21.1 147.8 21.1 148.8V171.7C21.1 172.7 21.9 173.5 22.9 173.5Z"/><path d="M37.1 173.5V147H59V173.5H37.1Z"/><path d="M55.4 173.5V147H77.3V173.5H55.4Z"/><path d="M91.5 173.5H73.7V147H91.5C92.5 147 93.3 147.8 93.3 148.8V171.7C93.3 172.7 92.5 173.5 91.5 173.5Z"/><path d="M77.8 136.9H95.6V110.4H77.8C76.8 110.4 76 111.2 76 112.2V135.1C76 136.1 76.8 136.9 77.8 136.9Z"/><path d="M109.8 136.9H92V110.4H109.8C110.8 110.4 111.6 111.2 111.6 112.2V135.1C111.6 136.1 110.8 136.9 109.8 136.9Z"/><path d="M22.9 27.1H40.7V0.7H22.9C21.9 0.7 21.1 1.5 21.1 2.4V25.3C21.1 26.3 21.9 27.1 22.9 27.1Z"/><path d="M37.1 27.1V0.7H59V27.1H37.1Z"/><path d="M55.4 27.1V0.7H77.3V27.1H55.4Z"/><path d="M73.7 27.1V0.7H95.6V27.1H73.7Z"/><path d="M109.8 27.1H92V0.7H109.8C110.8 0.7 111.6 1.5 111.6 2.4V25.3C111.6 26.3 110.8 27.1 109.8 27.1Z"/><path d="M77.8 63.7H95.6V37.3H77.8C76.8 37.3 76 38.1 76 39V61.9C76 62.9 76.8 63.7 77.8 63.7Z"/><path d="M109.8 63.7H92V37.3H109.8C110.8 37.3 111.6 38.1 111.6 39V61.9C111.6 62.9 110.8 63.7 109.8 63.7Z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
12
packages/website/static/img/mcp-clients/cursor.svg
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Ebene_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 466.73 532.09">
|
||||
<!-- Generator: Adobe Illustrator 29.6.1, SVG Export Plug-In . SVG Version: 2.1.1 Build 9) -->
|
||||
<defs>
|
||||
<style>
|
||||
.st0 {
|
||||
fill: #26251e;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<path class="st0" d="M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 793 B |
12
packages/website/static/img/mcp-clients/cursor_dark.svg
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Ebene_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 466.73 532.09">
|
||||
<!-- Generator: Adobe Illustrator 29.6.1, SVG Export Plug-In . SVG Version: 2.1.1 Build 9) -->
|
||||
<defs>
|
||||
<style>
|
||||
.st0 {
|
||||
fill: #edecec;
|
||||
}
|
||||
</style>
|
||||
</defs>
|
||||
<path class="st0" d="M457.43,125.94L244.42,2.96c-6.84-3.95-15.28-3.95-22.12,0L9.3,125.94c-5.75,3.32-9.3,9.46-9.3,16.11v247.99c0,6.65,3.55,12.79,9.3,16.11l213.01,122.98c6.84,3.95,15.28,3.95,22.12,0l213.01-122.98c5.75-3.32,9.3-9.46,9.3-16.11v-247.99c0-6.65-3.55-12.79-9.3-16.11h-.01ZM444.05,151.99l-205.63,356.16c-1.39,2.4-5.06,1.42-5.06-1.36v-233.21c0-4.66-2.49-8.97-6.53-11.31L24.87,145.67c-2.4-1.39-1.42-5.06,1.36-5.06h411.26c5.84,0,9.49,6.33,6.57,11.39h-.01Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 793 B |
6
packages/website/static/img/mcp-clients/opencode.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="512" height="512" fill="#FDFCFC"/>
|
||||
<path d="M320 224V352H192V224H320Z" fill="#E6E5E6"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M384 416H128V96H384V416ZM320 160H192V352H320V160Z" fill="#17181C"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 325 B |
|
|
@ -0,0 +1,7 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512"><svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="512" height="512" fill="#131010"></rect>
|
||||
<path d="M320 224V352H192V224H320Z" fill="#5A5858"></path>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M384 416H128V96H384V416ZM320 160H192V352H320V160Z" fill="white"></path>
|
||||
</svg><style>@media (prefers-color-scheme: light) { :root { filter: none; } }
|
||||
@media (prefers-color-scheme: dark) { :root { filter: none; } }
|
||||
</style></svg>
|
||||
|
After Width: | Height: | Size: 612 B |
21
packages/website/static/img/mcp-clients/pi.svg
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800">
|
||||
<rect width="800" height="800" rx="120" fill="#09090b"/>
|
||||
<path fill="#fff" fill-rule="evenodd" d="
|
||||
M165.29 165.29
|
||||
H517.36
|
||||
V400
|
||||
H400
|
||||
V517.36
|
||||
H282.65
|
||||
V634.72
|
||||
H165.29
|
||||
Z
|
||||
M282.65 282.65
|
||||
V400
|
||||
H400
|
||||
V282.65
|
||||
Z
|
||||
"/>
|
||||
<path fill="#fff" d="M517.36 400 H634.72 V634.72 H517.36 Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 440 B |
1
packages/website/static/img/mcp-clients/vscode.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 100 100"><mask id="a" width="100" height="100" x="0" y="0" mask-type="alpha" maskUnits="userSpaceOnUse"><path fill="#fff" fill-rule="evenodd" d="M70.912 99.317a6.223 6.223 0 0 0 4.96-.19l20.589-9.907A6.25 6.25 0 0 0 100 83.587V16.413a6.25 6.25 0 0 0-3.54-5.632L75.874.874a6.226 6.226 0 0 0-7.104 1.21L29.355 38.04 12.187 25.01a4.162 4.162 0 0 0-5.318.236l-5.506 5.009a4.168 4.168 0 0 0-.004 6.162L16.247 50 1.36 63.583a4.168 4.168 0 0 0 .004 6.162l5.506 5.01a4.162 4.162 0 0 0 5.318.236l17.168-13.032L68.77 97.917a6.217 6.217 0 0 0 2.143 1.4ZM75.015 27.3 45.11 50l29.906 22.701V27.3Z" clip-rule="evenodd"/></mask><g mask="url(#a)"><path fill="#0065A9" d="M96.461 10.796 75.857.876a6.23 6.23 0 0 0-7.107 1.207l-67.451 61.5a4.167 4.167 0 0 0 .004 6.162l5.51 5.009a4.167 4.167 0 0 0 5.32.236l81.228-61.62c2.725-2.067 6.639-.124 6.639 3.297v-.24a6.25 6.25 0 0 0-3.539-5.63Z"/><g filter="url(#b)"><path fill="#007ACC" d="m96.461 89.204-20.604 9.92a6.229 6.229 0 0 1-7.107-1.207l-67.451-61.5a4.167 4.167 0 0 1 .004-6.162l5.51-5.009a4.167 4.167 0 0 1 5.32-.236l81.228 61.62c2.725 2.067 6.639.124 6.639-3.297v.24a6.25 6.25 0 0 1-3.539 5.63Z"/></g><g filter="url(#c)"><path fill="#1F9CF0" d="M75.858 99.126a6.232 6.232 0 0 1-7.108-1.21c2.306 2.307 6.25.674 6.25-2.588V4.672c0-3.262-3.944-4.895-6.25-2.589a6.232 6.232 0 0 1 7.108-1.21l20.6 9.908A6.25 6.25 0 0 1 100 16.413v67.174a6.25 6.25 0 0 1-3.541 5.633l-20.601 9.906Z"/></g><path fill="url(#d)" fill-rule="evenodd" d="M70.851 99.317a6.224 6.224 0 0 0 4.96-.19L96.4 89.22a6.25 6.25 0 0 0 3.54-5.633V16.413a6.25 6.25 0 0 0-3.54-5.632L75.812.874a6.226 6.226 0 0 0-7.104 1.21L29.294 38.04 12.126 25.01a4.162 4.162 0 0 0-5.317.236l-5.507 5.009a4.168 4.168 0 0 0-.004 6.162L16.186 50 1.298 63.583a4.168 4.168 0 0 0 .004 6.162l5.507 5.009a4.162 4.162 0 0 0 5.317.236L29.294 61.96l39.414 35.958a6.218 6.218 0 0 0 2.143 1.4ZM74.954 27.3 45.048 50l29.906 22.701V27.3Z" clip-rule="evenodd" opacity=".25" style="mix-blend-mode:overlay"/></g><defs><filter id="b" width="116.727" height="92.246" x="-8.394" y="15.829" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset/><feGaussianBlur stdDeviation="4.167"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/><feBlend in2="BackgroundImageFix" mode="overlay" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><filter id="c" width="47.917" height="116.151" x="60.417" y="-8.076" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/><feOffset/><feGaussianBlur stdDeviation="4.167"/><feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/><feBlend in2="BackgroundImageFix" mode="overlay" result="effect1_dropShadow"/><feBlend in="SourceGraphic" in2="effect1_dropShadow" result="shape"/></filter><linearGradient id="d" x1="49.939" x2="49.939" y1=".258" y2="99.742" gradientUnits="userSpaceOnUse"><stop stop-color="#fff"/><stop offset="1" stop-color="#fff" stop-opacity="0"/></linearGradient></defs></svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
1
packages/website/static/img/mcp-clients/windsurf.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M897.246 286.869H889.819C850.735 286.808 819.017 318.46 819.017 357.539V515.589C819.017 547.15 792.93 572.716 761.882 572.716C743.436 572.716 725.02 563.433 714.093 547.85L552.673 317.304C539.28 298.16 517.486 286.747 493.895 286.747C457.094 286.747 423.976 318.034 423.976 356.657V515.619C423.976 547.181 398.103 572.746 366.842 572.746C348.335 572.746 329.949 563.463 319.021 547.881L138.395 289.882C134.316 284.038 125.154 286.93 125.154 294.052V431.892C125.154 438.862 127.285 445.619 131.272 451.34L309.037 705.2C319.539 720.204 335.033 731.344 352.9 735.392C397.616 745.557 438.77 711.135 438.77 667.278V508.406C438.77 476.845 464.339 451.279 495.904 451.279H495.995C515.02 451.279 532.857 460.562 543.785 476.145L705.235 706.661C718.659 725.835 739.327 737.218 763.983 737.218C801.606 737.218 833.841 705.9 833.841 667.308V508.376C833.841 476.815 859.41 451.249 890.975 451.249H897.276C901.233 451.249 904.43 448.053 904.43 444.097V294.021C904.43 290.065 901.233 286.869 897.276 286.869H897.246Z" fill="#0b100f"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -0,0 +1 @@
|
|||
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M897.246 286.869H889.819C850.735 286.808 819.017 318.46 819.017 357.539V515.589C819.017 547.15 792.93 572.716 761.882 572.716C743.436 572.716 725.02 563.433 714.093 547.85L552.673 317.304C539.28 298.16 517.486 286.747 493.895 286.747C457.094 286.747 423.976 318.034 423.976 356.657V515.619C423.976 547.181 398.103 572.746 366.842 572.746C348.335 572.746 329.949 563.463 319.021 547.881L138.395 289.882C134.316 284.038 125.154 286.93 125.154 294.052V431.892C125.154 438.862 127.285 445.619 131.272 451.34L309.037 705.2C319.539 720.204 335.033 731.344 352.9 735.392C397.616 745.557 438.77 711.135 438.77 667.278V508.406C438.77 476.845 464.339 451.279 495.904 451.279H495.995C515.02 451.279 532.857 460.562 543.785 476.145L705.235 706.661C718.659 725.835 739.327 737.218 763.983 737.218C801.606 737.218 833.841 705.9 833.841 667.308V508.376C833.841 476.815 859.41 451.249 890.975 451.249H897.276C901.233 451.249 904.43 448.053 904.43 444.097V294.021C904.43 290.065 901.233 286.869 897.276 286.869H897.246Z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
1
packages/website/static/img/mcp-clients/zed.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" fill="none" viewBox="0 0 96 96"><g clip-path="url(#a)"><path fill="currentColor" fill-rule="evenodd" d="M9 6a3 3 0 0 0-3 3v66H0V9a9 9 0 0 1 9-9h80.379c4.009 0 6.016 4.847 3.182 7.682L43.055 57.187H57V51h6v7.688a4.5 4.5 0 0 1-4.5 4.5H37.055L26.743 73.5H73.5V36h6v37.5a6 6 0 0 1-6 6H20.743L10.243 90H87a3 3 0 0 0 3-3V21h6v66a9 9 0 0 1-9 9H6.621c-4.009 0-6.016-4.847-3.182-7.682L52.757 39H39v6h-6v-7.5a4.5 4.5 0 0 1 4.5-4.5h21.257l10.5-10.5H22.5V60h-6V22.5a6 6 0 0 1 6-6h52.757L85.757 6H9Z" clip-rule="evenodd"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h96v96H0z"/></clipPath></defs></svg>
|
||||
|
After Width: | Height: | Size: 660 B |
1
packages/website/static/img/mcp-clients/zed_dark.svg
Normal file
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" fill="none" viewBox="0 0 96 96"><g clip-path="url(#a)"><path fill="#ffff" fill-rule="evenodd" d="M9 6a3 3 0 0 0-3 3v66H0V9a9 9 0 0 1 9-9h80.379c4.009 0 6.016 4.847 3.182 7.682L43.055 57.187H57V51h6v7.688a4.5 4.5 0 0 1-4.5 4.5H37.055L26.743 73.5H73.5V36h6v37.5a6 6 0 0 1-6 6H20.743L10.243 90H87a3 3 0 0 0 3-3V21h6v66a9 9 0 0 1-9 9H6.621c-4.009 0-6.016-4.847-3.182-7.682L52.757 39H39v6h-6v-7.5a4.5 4.5 0 0 1 4.5-4.5h21.257l10.5-10.5H22.5V60h-6V22.5a6 6 0 0 1 6-6h52.757L85.757 6H9Z" clip-rule="evenodd"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h96v96H0z"/></clipPath></defs></svg>
|
||||
|
After Width: | Height: | Size: 653 B |