docs/mintlify/cloud/package-search/mcp.mdx
import { Warning } from '/snippets/callout.mdx';
The Package Search MCP Server is an MCP server designed to add ground truth context about code packages to AI agents. Our research demonstrates that by exposing the source code of a project's dependencies to a model, we improve its performance on coding tasks and reduce its potential for hallucination. Chroma's Package Search MCP server achieves this by exposing tools to allow the model to retrieve necessary context:
| Tool Name | Usage |
|---|---|
package_search_grep | Use regex pattern matching to retrieve relevant lines from source code |
package_search_hybrid | Use semantic search with optional regex filtering to explore source code without existing knowledge of its structure |
package_search_read_file | Reads specific lines from a single file in the code package |
import anthropic
client = anthropic.Anthropic(
api_key="<YOUR_ANTHROPIC_API_KEY>"
)
response = client.beta.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1000,
messages=[
{
"role": "user",
"content": "Explain how numpy implements its FFT. Use package search.",
}
],
mcp_servers=[
{
"type": "url",
"url": "https://mcp.trychroma.com/package-search/v1",
"name": "package-search",
"authorization_token": "<YOUR_CHROMA_API_KEY>",
}
],
betas=["mcp-client-2025-04-04"],
)
print(response)
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
"github.com/anthropics/anthropic-sdk-go/option"
"github.com/anthropics/anthropic-sdk-go/packages/param"
)
func main() {
client := anthropic.NewClient(
option.WithAPIKey("<YOUR_ANTHROPIC_API_KEY>"),
option.WithHeader("anthropic-beta", anthropic.AnthropicBetaMCPClient2025_04_04),
)
content := "Explain how numpy implements its FFT. Use package search."
fmt.Println("[user]:", content)
messages := []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(
anthropic.NewBetaTextBlock(content),
),
}
mcpServers := []anthropic.BetaRequestMCPServerURLDefinitionParam{
{
URL: "https://mcp.trychroma.com/package-search/v1",
Name: "package-search",
AuthorizationToken: param.NewOpt("<YOUR_CHROMA_API_KEY>"),
ToolConfiguration: anthropic.BetaRequestMCPServerToolConfigurationParam{
Enabled: anthropic.Bool(true),
},
},
}
message, err := client.Beta.Messages.New(
context.TODO(),
anthropic.BetaMessageNewParams{
MaxTokens: 1024,
Messages: messages,
Model: anthropic.ModelClaudeSonnet4_20250514,
MCPServers: mcpServers,
},
)
if err != nil {
log.Fatalf("request failed: %v", err)
}
for _, block := range message.Content {
textBlock := block.AsText()
fmt.Println("[assistant]:", textBlock.Text)
}
}
from openai import OpenAI
client = OpenAI(
api_key="<YOUR_OPENAI_API_KEY>"
)
resp = client.responses.create(
model="gpt-5-chat-latest",
input="Explain how numpy implements its FFT. Use package search.",
tools=[
{
"type": "mcp",
"server_label": "package-search",
"server_url": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
},
"require_approval": "never",
}
],
)
print(resp)
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
from google import genai
client = genai.Client(api_key="<YOUR_GEMINI_API_KEY>")
async def run():
async with streamablehttp_client(
"https://mcp.trychroma.com/package-search/v1",
headers={"x-chroma-token": "<YOUR_CHROMA_API_KEY>"},
) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
try:
prompt = f"Explain how numpy implements its FFT. Use package search."
response = await client.aio.models.generate_content(
model="gemini-2.5-flash",
contents=prompt,
config=genai.types.GenerateContentConfig(
temperature=0,
tools=[session],
),
)
try:
if response.text:
print("--- Generated Text ---")
print(response.text)
else:
print("Model did not return text.")
print(f"Finish Reason: {response.candidates[0].finish_reason.name}")
except ValueError:
print("Could not access response.text.")
except Exception as e:
print(f"An error occurred: {e}")
asyncio.run(run())
claude mcp add --transport http package-search https://mcp.trychroma.com/package-search/v1 --header "x-chroma-token: <YOUR_CHROMA_API_KEY>"
[mcp_servers.package-search]
command = "npx"
args = ["mcp-remote", "https://mcp.trychroma.com/package-search/v1", "--header", "x-chroma-token: ${X_CHROMA_TOKEN}"]
env = { "X_CHROMA_TOKEN" = "<YOUR_CHROMA_API_KEY>" }
{
"mcpServers": {
"package-search": {
"transport": "streamable_http",
"url": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
}
}
}
}
{
"mcpServers": {
"package-search": {
"serverUrl": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
}
}
}
}
{
"mcpServers": {
"package-search": {
"command": "npx",
"args": ["mcp-remote", "https://mcp.trychroma.com/package-search/v1", "--header", "x-chroma-token: ${X_CHROMA_TOKEN}"],
"env": {
"X_CHROMA_TOKEN": "<YOUR_CHROMA_API_KEY>"
}
}
}
}
{
"package-search": {
"command": "npx",
"args": ["mcp-remote", "https://mcp.trychroma.com/package-search/v1", "--header", "x-chroma-token: ${X_CHROMA_TOKEN}"],
"env": {
"X_CHROMA_TOKEN": "<YOUR_CHROMA_API_KEY>"
}
}
}
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"code-packages": {
"type": "remote",
"url": "https://mcp.trychroma.com/package-search/v1",
"enabled": true,
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
}
}
}
}
pip install ollmcp
{
"mcpServers": {
"code-packages": {
"type": "streamable_http",
"url": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
},
"disabled": false
}
}
}
ollmcp --servers-json <path/to/mcp_config.json> --model <model>
import asyncio
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
async def main():
async with streamablehttp_client(
"https://mcp.trychroma.com/package-search/v1",
headers={"x-chroma-token": "<YOUR_CHROMA_API_KEY>"},
) as (
read_stream,
write_stream,
_,
):
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
tools = await session.list_tools()
result = await session.call_tool(
name="package_search_grep",
arguments={
"package_name": "numpy",
"registry_name": "py_pi",
"pattern": "\bdef fft\b",
},
)
print(f"Got result: {result}")
print(f"Available tools: {[tool.name for tool in tools.tools]}")
asyncio.run(main())
{
"mcpServers": {
"code-collections": {
"type": "streamable-http",
"url": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
}
}
}
}