Kagi MCP Server
OfficialThe Kagi MCP Server provides access to Kagi's search and summarization tools:
Web Search: Execute one or more search queries, returning numbered results for easy reference.
Content Summarization: Summarize videos or other content using customizable engines like 'cecil' or 'daphne'.
Claude Desktop Integration: Configure and integrate with Claude Desktop for enhanced functionality.
Customization Options: Adjust logging levels via the
FASTMCP_LOG_LEVELenvironment variable.Requirements: Needs a Kagi API key and access to Kagi's closed beta search API.
Integrates with Kagi search API to provide search capabilities to Claude AI, allowing Claude to answer questions requiring up-to-date information through internet search
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Kagi MCP Serverwhat are the latest developments in quantum computing?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Kagi MCP Server
An MCP server backed by the Kagi API. It exposes search and extraction tools to MCP-compatible clients.
Tools
kagi_search_fetch- web, news, videos, podcasts, and image search with optional page extracts, filters, and Kagi lenses.kagi_extract- fetch a page's full content as markdown.
Note: The previous
kagi_fastgptandkagi_summarizertools have been removed. Both are planned to return in a future release.
Related MCP server: sysauto Ask MCP Server
Hosted Server
We run a hosted MCP server at https://mcp.kagi.com/mcp — no install required. Point any HTTP-capable MCP client at it and authenticate with your Kagi API key.
OAuth2 isn't supported yet (it's on our roadmap), so for now grab your API key from the dashboard and pass it via Bearer HTTP authentication.
Example with Claude Code:
claude mcp add kagi https://mcp.kagi.com/mcp --transport http --header "Authorization: Bearer $(read -sp 'API key: ' k; echo $k)" --scope userPrefer to run it yourself? See Client Setup for the local uvx install, or Self-Hosting to host the HTTP server on your own infrastructure.
Requirements
A Kagi API key in
KAGI_API_KEY.uvfor the recommendeduvxinstall path.
Install uv:
curl -LsSf https://astral.sh/uv/install.sh | shWindows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Client Setup
Codex CLI
codex mcp add kagi --env KAGI_API_KEY=<YOUR_API_KEY_HERE> -- uvx kagimcpCodex writes MCP configuration to ~/.codex/config.toml.
Claude Desktop
Install uv first.
MacOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | shWindows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"Then in your Claude Desktop config (found through Settings -> Developer -> Edit Config):
{
"mcpServers": {
"kagi": {
"command": "uvx",
"args": ["kagimcp"],
"env": {
"KAGI_API_KEY": "YOUR_API_KEY_HERE"
}
}
}
}Claude Code
claude mcp add kagi -e KAGI_API_KEY="YOUR_API_KEY_HERE" -- uvx kagimcpSmithery
npx -y @smithery/cli install kagimcp --client claudeKiro
Add to your Kiro MCP config file (~/.kiro/settings/mcp.json for global, or .kiro/settings/mcp.json for project-scoped) using the same mcpServers JSON as Claude Desktop. See the Kiro MCP documentation for more details.
OpenCode
Edit the OpenCode configuration file in ~/.config/opencode/opencode.json and add the following:
{
"mcp": {
"kagi": {
"type": "local",
"command": ["uvx", "kagimcp"],
"enabled": true,
"environment": {
"KAGI_API_KEY": "<YOUR_API_KEY_HERE>"
}
}
}
}Usage Examples
Search:
Who was Time's 2024 person of the year?Extract:
extract the full content of https://en.wikipedia.org/wiki/Model_Context_Protocol
Configuration
Environment variable | Description |
| Required Kagi API key. |
| Logging level, for example |
| Search timeout in seconds. Defaults to |
| Extract timeout in seconds. Defaults to |
| Max retry attempts after the first request. Defaults to |
| Comma-separated search params to hide from the LLM-facing schema. |
Hideable search params:
workflow, extract_count, limit, include_domains, exclude_domains, time_relative, after, before, file_type, lens_idExample:
KAGI_HIDDEN_PARAMS="extract_count,after,before,time_relative,include_domains,exclude_domains"Local Development
git clone https://github.com/kagisearch/kagimcp.git
cd kagimcp
uv syncRun locally over stdio:
KAGI_API_KEY=<YOUR_API_KEY_HERE> uv run kagimcpRun with streamable HTTP transport:
KAGI_API_KEY=<YOUR_API_KEY_HERE> uv run kagimcp --http --host 0.0.0.0 --port 8000Self-Hosting
HTTP mode is multi-tenant: each request supplies its API key via the
Authorization: Bearer <key> header instead of a server-wide env var, so one
instance can serve multiple users. The repo ships a Dockerfile that installs a pinned kagimcp from PyPI and
runs it in HTTP mode. The container respects $PORT so it works on any
platform that injects one (Railway, Render, Cloud Run, Fly.io, etc.).
Build and run locally:
docker build -t kagimcp-hosted .
docker run --rm -p 8000:8000 kagimcp-hostedSmoke test:
curl -sL http://127.0.0.1:8000/mcp -X POST \
-H "authorization: Bearer $KAGI_API_KEY" \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'To bump the version in production, edit the pin in the Dockerfile and redeploy.
Debugging
Inspect the published package:
npx @modelcontextprotocol/inspector uvx kagimcpInspect a local checkout:
npx @modelcontextprotocol/inspector uv --directory /ABSOLUTE/PATH/TO/kagimcp run kagimcpThe inspector is usually available at http://localhost:5173.
Prerelease Instructions
If using a prerelease build, the same installation instructions apply, but use uvx --prerelease allow --from kagimcp==1.0.0rc2 kagimcp instead of uvx kagimcp (replace 1.0.0rc2 with whatever version you're wanting to install).
Available Tools
2 toolskagi_extractA
Extract the content of a web page as markdown using the Kagi Extract API. Use this to read the full content of a page when needed.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | The HTTPS URL of the page to extract content from. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so description carries full burden. Only states core behavior without additional context like rate limits, authorization, or side effects. Adequate for a simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff, front-loaded with purpose. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Low complexity with one parameter and existing output schema. Description covers what it does and when to use it, but could mention potential errors or prerequisites for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and describes the only parameter (url). Description adds no extra meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (extract content), resource (web page), output format (markdown), and API. Distinguishes from sibling tool by focusing on content extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to read the full content of a page when needed,' providing clear context. Does not explicitly exclude alternatives, but sibling name implies separation of concerns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kagi_search_fetchA
Fetch web results for a query using the Kagi Search API. Use for general search and when the user explicitly tells you to 'fetch' results/information. Results are numbered so that a user may refer to a result by a specific number.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Only include results published/updated on or after this date (ISO format, e.g., '2024-01-15'). | |
| limit | No | Maximum number of results per category. In the mixed 'search' workflow this caps each category independently, so the total can exceed this number; in single-category workflows it caps total results. | |
| query | Yes | A concise, keyword-focused search query. Include essential context for standalone use. | |
| before | No | Only include results published/updated on or before this date (ISO format, e.g., '2024-12-31'). | |
| lens_id | No | Apply a Kagi lens to narrow the search to a curated set of sources. Built-in lens IDs: '2' (Academic — education/.edu domains), '1' (Forums — discussion forums across the web), '15' (Programming — official programming language sites and forums), '29' (News 360 — multi-perspective coverage of global news), '120' (Recipes — high-quality recipe sites, English), '107' (Small Web — noncommercial domains and topics). You may also pass a custom lens ID or full URL from https://kagi.com/settings/lenses (only shareable lenses work). Mutually exclusive with 'include_domains', 'exclude_domains', 'time_relative', and 'file_type'; use those args or 'lens_id', not both. | |
| workflow | No | Type of results to return. Use 'news' for current events and recent reporting, 'videos' for video content (e.g. tutorials, talks), 'podcasts' for audio shows, 'images' for image results, or the default 'search' for general web results. Note that 'search' may return a mix of categories (web, news, videos, images) in one response, like a typical SERP; the other workflows return only their single category. | search |
| file_type | No | Restrict to results with this file type (e.g., 'pdf', 'docx', 'xlsx'). Specify the extension without a leading dot. | |
| extract_count | No | Number of top results to fetch full page content for, inline as markdown. | |
| time_relative | No | Restrict to results published/updated within the last day, week, or month, evaluated server-side. Mutually exclusive with 'after'/'before'. | |
| exclude_domains | No | Exclude results from these domains (e.g., ['pinterest.com', 'quora.com']). Overrides any 'site:' operators in the query. | |
| include_domains | No | Restrict results to these domains (e.g., ['docs.python.org', 'github.com']). Overrides any 'site:' operators in the query. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds one behavioral trait: 'Results are numbered so that a user may refer to a result by a specific number.' With no annotations provided, the description carries the full burden, but it does not disclose other behaviors like rate limits, authentication needs, or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two sentences, front-loading the core purpose and adding essential usage guidance and a behavioral trait without any fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, output schema exists, sibling tool present), the description is mostly complete. It explains the tool's purpose and numbering, but could mention that results include standard fields (title, URL) though the output schema likely covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-level information beyond what is already in the schema; it merely states the overall purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch web results for a query using the Kagi Search API', which specifies the verb and resource. It further distinguishes usage for general search and when the user explicitly says 'fetch', helping differentiate from sibling kagi_extract (which likely extracts content from a URL).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'Use for general search and when the user explicitly tells you to fetch results/information.' It implies when to use it but does not explicitly exclude alternative tools like kagi_extract or list when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a clearly distinct purpose: one extracts page content, the other fetches search results. There is no overlap or ambiguity between them.
Both tools follow a consistent 'kagi_' prefix combined with a verb_noun pattern ('extract' and 'search_fetch'), making naming predictable and clear.
With only two tools, the set is minimal but still covers the core search and extract functionalities. However, it feels thin compared to typical MCP servers, which might offer more diverse operations.
The server provides the essential operations for its domain: searching and retrieving content. While additional tools like summarization could be useful, the current set is reasonably complete for basic tasks.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Driflyte MCP server which lets AI assistants query topic-specific knowledge from web and GitHub.
MCP server giving Claude AI access to 22+ NYC public-record databases for real estate due diligence
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that enables Claude to perform web searches using Perplexity's API with intelligent model selection based on query intent and support for domain and recency filtering.64MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that integrates with Sonar API to provide Claude with real-time web search capabilities for comprehensive research.23MIT
- AlicenseDqualityCmaintenanceMCP server that provides Claude AI assistants with the ability to search the web, get news, and perform research using the You.com API.42MIT
- AlicenseNot gradedqualityDmaintenanceMCP server integrating the Kagi Search API to perform web searches using the kagi_search tool.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kagisearch/kagimcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server