🚀 Chroma 包搜索
Chroma 包搜索项目精心整理了一系列公开代码包,并将其索引到 Chroma 集合中。目前,该仓库已对来自多个软件包注册中心的 3000 多个 包进行了索引。如果您希望某个依赖项被索引,请提交 PR 或创建一个问题!
快速链接:
🚀 快速开始
✨ 主要特性
本仓库是 Chroma 进行代码搜索和检索时所索引包的权威来源。它涵盖了多个软件包注册中心的众多包,为开发者提供了丰富的代码资源。
📦 安装指南
Chroma 的包搜索 MCP 服务器是一个远程 MCP 服务器,您可以从许多客户端使用它。
| 属性 |
详情 |
| 服务器 URL |
https://mcp.trychroma.com/package-search/v1 |
| 认证头名称* |
x-chroma-token |
| 认证头值 |
<YOUR_CHROMA_API_KEY> |
* 截至 2025 年 9 月 12 日,由于 Anthropic API 尚不支持自定义头,因此我们接受 Authorization 头。
⚠️ 重要提示
您可以在 trychroma.com/package-search 获取 API 密钥。
常见客户端配置方法
Cursor
创建或编辑 ~/.cursor/mcp.json:
{
"mcpServers": {
"package-search": {
"transport": "streamable_http",
"url": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
}
}
}
}
VS Code (Copilot Chat MCP)
创建或编辑 .vscode/mcp.json:
{
"servers": {
"package-search": {
"type": "http",
"url": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
}
}
}
}
Windsurf
打开 Windsurf MCP 设置并编辑为包含以下内容:
{
"mcpServers": {
"package-search": {
"serverUrl": "https://mcp.trychroma.com/package-search/v1",
"headers": {
"x-chroma-token": "<YOUR_CHROMA_API_KEY>"
}
}
}
}
Warp
将以下内容添加到您的 Warp MCP 配置中。添加后,请确保在服务器上点击“开始”。
{
"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>"
}
}
}
Codex
将以下内容添加到您的 ~/.codex/config.toml 文件中,并替换为您的 Chroma Cloud API 密钥:
[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>" }
Claude Code
在您的终端中运行以下命令:
claude mcp add --transport http package-search https://mcp.trychroma.com/package-search/v1 --header "x-chroma-token: <YOUR_CHROMA_API_KEY>"
OpenAI SDK (Python)
from openai import OpenAI
client = OpenAI(api_key="<YOUR_OPENAI_API_KEY>")
resp = client.responses.create(
model="gpt-5",
input="Explain how colorlog implements testing in python",
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)
Anthropic SDK (Python)
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 colorlog implements testing in python"}],
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)
Google Gemini SDK (Python)
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()
prompt = "what logging levels are available in uber's zap go module?"
response = await client.aio.models.generate_content(
model="gemini-2.5-flash",
contents=prompt,
config=genai.types.GenerateContentConfig(temperature=0, tools=[session]),
)
print(response.text if hasattr(response, "text") else response)
asyncio.run(run())
MCP SDK (Python)
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": "colorlog", "registry_name": "py_pi", "pattern": "\bclass\b"},
)
print(f"Got result: {result}")
print(f"Available tools: {[t.name for t in tools.tools]}")
asyncio.run(main())
Ollama (via ollmcp)
创建 mcp_config.json:
{
"mcpServers": {
"package-search": {
"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 qwen2.5
Open Code
添加到 ~/.config/opencode/opencode.json:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"package-search": {
"type": "remote",
"url": "https://mcp.trychroma.com/package-search/v1",
"enabled": true,
"headers": { "x-chroma-token": "<YOUR_CHROMA_API_KEY>" }
}
}
}
📚 详细文档
仓库结构
仓库的组织方式如下:
package-search/
├── index.json # 列举所有已通过或正在通过索引管道运行的包
├── versions.json # 列举所有当前已索引的包和版本
├── npm/ # npm 包
│ ├── react/
│ │ └── config.json
│ ├── vue/
│ │ └── config.json
│ └── ...
├── pypi/ # PyPI 包
│ ├── requests/
│ │ └── config.json
│ └── ...
├── crates_io/ # Rust 包
│ ├── serde/
│ │ └── config.json
│ └── ...
└── go/ # Go 包
├── github.com/
│ └── gin-gonic/
│ └── gin/
│ └── config.json
└── ...
每个包都有自己的配置文件,位于 <registry>/<native_identifier>/config.json。
添加新包
首选方法:拉取请求(审核速度更快)
如果您拥有所有必需的配置信息,我们强烈建议您提交拉取请求(PR),因为 PR 的审核周转时间 更快。操作步骤如下:
-
分叉此仓库
-
在 <registry>/<native_identifier>/ 创建一个新目录
-
在该目录中添加一个 config.json 文件,格式如下:
{
"native_identifier": "chromadb",
"collection_name_prefix": "chromadb",
"repo": "chroma-core/chroma",
"registry": "py_pi",
"tag_formats": [
"{major}.{minor}.{patch}",
],
"sentinel_timestamp": "2024-01-01T00:00:00Z",
"include": [
"**/*.md",
"**/*.py",
"**/*.rs",
],
"version_sample_relative_size": 0.1,
"version_sample_max_size": 10
}
必填字段说明:
native_identifier:包所托管的注册中心使用的标识符。对于大多数注册中心,这应该是包的常用名称。对于 GitHub 版本,这应该是所有者用户或组织的用户名,后跟斜杠,再跟仓库名称(例如,chroma-core/code-collections)。对于 Golang 模块,这应该是完整的模块路径(例如,github.com/stretchr/testify/)。
collection_name_prefix:为该包创建的 Chroma 集合名称中版本之前的文本。我们将集合命名为 <collection_name_prefix>_<version>。集合名称用于在 Chroma 中查询索引记录,因此通常应该是包的常用名称或其某种变体。请注意,集合名称前缀在一个注册中心内必须全局唯一。也就是说,同一注册中心中的任何两个包都不能有相同的集合名称前缀。
repo:包的源代码所在的 GitHub 仓库。提供所有者用户或组织的用户名,后跟斜杠,再跟仓库名称。
registry:包版本发布到的注册中心。必须是 "npm"、"py_pi"、"crates_io"、"golang_proxy" 或 "github_releases" 之一。
tag_formats:枚举包版本的 所有可能标签格式 的 git 标签格式数组。请注意,Chroma 假定包版本可以解析为带标签(注释或轻量级)的 git 提交。我们会为您处理版本到标签的解析,但我们只能解析我们知道存在的标签格式,这些格式从该配置字段中获取。有关更多信息,请参阅 标签格式指南。
sentinel_timestamp:最早的索引时间;在此之前发布的版本将被排除。必须是符合 RFC 3339/ISO 8601 的时间戳。
include:要索引的文件的 全局模式 数组(例如,["**/*.md", "**/*.ts", "**/*.js"])。
version_sample_relative_size:在单次遍历中要索引的包的所有发布版本的比例。目前,Chroma 每天为位于此仓库根目录的 index.json 文件中的每个包运行一次索引作业。每个索引作业对给定包的可用版本的一个子集进行操作。此参数控制每次运行索引作业时该子集的大小。
version_sample_max_size:在有许多版本的情况下,此字段限制样本大小。给定包的样本中的版本数量永远不会超过为此字段提供的值。
-
更新 index.json 文件,将您的新包包含在 Chroma 下次索引作业期间将扫描的包中
-
创建拉取请求,并清晰描述您要添加的包(使用我们的 PR 模板)
-
等待审核 - Chroma 团队成员将审核您的 PR
替代方法:提交问题
如果您没有所有必需的配置详细信息(例如版本采样逻辑或标签格式),可以提交一个问题:
- 创建一个新问题,使用我们的 包请求问题模板
- 提供包名称、注册中心和链接 到其主页或 GitHub 仓库
- 包含您知道的任何配置详细信息 - 您提供的信息越多,我们处理请求的速度就越快
- 等待 Chroma 团队 收集缺失的配置详细信息并添加包
注意:与 PR 相比,问题的处理时间通常更长,因为我们的团队需要研究和配置缺失的详细信息。
审核流程
- 所有 PR 均由 Chroma 团队成员审核
- 我们根据相关性、受欢迎程度和社区价值评估包
- 被接受的包将被索引,并可通过 Chroma 的 包搜索 MCP 服务器 进行搜索
当前索引
该仓库目前索引来自以下注册中心的包:
- NPM - JavaScript/TypeScript 包
- PyPI - Python 包
- crates.io - Rust 包
- Golang Proxy - Go 模块
- GitHub Releases - 通过 GitHub 版本分发的包
贡献指南
- 确保包是公开可用且维护良好的
- 验证
native_identifier 与注册中心中的包名称完全匹配
- 确认 GitHub 仓库存在且可访问
- 格式化
tag_formats 数组以匹配实际的 GitHub 发布标签
- 将
sentinel_timestamp 设置为合理的历史索引起始点
- 在
include 数组中使用全局模式(例如,"**/*.md" 而不是 ".md")
- 更新
index.json 文件以包含您的新包
- 在 PR 描述中提供添加该包应被索引的上下文
多仓库注意事项
如果您要添加的仓库是一个多仓库(包含多个包),则必须在 include 数组中格式化全局模式,以仅针对特定包的子目录。例如:
{
"native_identifier": "my-package",
"collection_name_prefix": "my-package",
"repo": "owner/monorepo",
"registry": "npm",
"tag_formats": ["v{major}.{minor}.{patch}"],
"sentinel_timestamp": "2024-01-01T00:00:00Z",
"include": [
"my-package/**/*.md",
"my-package/**/*.ts",
"my-package/**/*.js"
]
}
这确保仅索引 my-package/ 目录中的文件,而不是整个多仓库。
本仓库由 Chroma 团队维护,以支持我们的代码搜索和检索功能。