🚀 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 團隊維護,以支持我們的代碼搜索和檢索功能。