From c9fc0cd75054c82f25268adbb0adf6eb258c06b7 Mon Sep 17 00:00:00 2001 From: Yiorgis Gozadinos Date: Wed, 8 Oct 2025 11:00:52 +0300 Subject: [PATCH] MCP server registry --- .github/workflows/publish-mcp.yml | 35 +++++ .gitignore | 4 + server.json | 253 ++++++++++++++++++++++++++++++ 3 files changed, 292 insertions(+) create mode 100644 .github/workflows/publish-mcp.yml create mode 100644 server.json diff --git a/.github/workflows/publish-mcp.yml b/.github/workflows/publish-mcp.yml new file mode 100644 index 00000000..6740721b --- /dev/null +++ b/.github/workflows/publish-mcp.yml @@ -0,0 +1,35 @@ +name: Publish to MCP Registry +on: + workflow_run: + workflows: ["Build & publish to pypi"] + types: + - completed + +jobs: + publish-mcp: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Generate server.json from template + run: | + VERSION=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])") + sed "s/{{VERSION}}/$VERSION/g" server.json > server.json.tmp + mv server.json.tmp server.json + echo "Generated server.json with version: $VERSION" + - name: Install MCP Publisher + run: | + curl -L https://github.com/modelcontextprotocol/publisher/releases/latest/download/mcp-publisher-linux-x86_64 -o mcp-publisher + chmod +x mcp-publisher + sudo mv mcp-publisher /usr/local/bin/ + - name: Login to MCP Registry + run: mcp-publisher login github-oidc + - name: Publish to MCP Registry + run: mcp-publisher publish diff --git a/.gitignore b/.gitignore index 48bed481..6de6adf4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,7 @@ tests/data/ TODO.md PLAN.md DEVNOTES.md + +# mcp registry +.mcpregistry_github_token +.mcpregistry_registry_token diff --git a/server.json b/server.json new file mode 100644 index 00000000..c3eb7a3a --- /dev/null +++ b/server.json @@ -0,0 +1,253 @@ +{ + "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json", + "name": "io.github.ggozad/haiku-rag", + "version": "{{VERSION}}", + "description": "Agentic Retrieval Augmented Generation (RAG) with LanceDB", + "repository": { + "url": "https://github.com/ggozad/haiku.rag", + "source": "github" + }, + "homepage": "https://github.com/ggozad/haiku.rag", + "license": "MIT", + "keywords": ["rag", "lancedb", "vector-database", "embeddings", "search", "qa", "research"], + "vendor": { + "name": "Yiorgis Gozadinos", + "url": "https://github.com/ggozad" + }, + "deployment": { + "packages": [ + { + "type": "pypi", + "package": "haiku.rag", + "command": { + "linux-x86_64": { + "shell": "uvx", + "args": ["haiku.rag", "serve", "--stdio"] + }, + "darwin-arm64": { + "shell": "uvx", + "args": ["haiku.rag", "serve", "--stdio"] + }, + "darwin-x86_64": { + "shell": "uvx", + "args": ["haiku.rag", "serve", "--stdio"] + }, + "win32-x86_64": { + "shell": "uvx.exe", + "args": ["haiku.rag", "serve", "--stdio"] + } + }, + "environmentVariables": [ + { + "name": "ENV", + "description": "Runtime environment (production or development)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "DEFAULT_DATA_DIR", + "description": "Default directory for LanceDB data and assets", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "MONITOR_DIRECTORIES", + "description": "Comma-separated paths to watch for file changes in server mode", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "LANCEDB_URI", + "description": "LanceDB connection URI (use db:// for cloud or a filesystem path)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "LANCEDB_REGION", + "description": "LanceDB cloud region (if using cloud)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "LANCEDB_API_KEY", + "description": "LanceDB API key (required for LanceDB Cloud)", + "format": "string", + "isRequired": false, + "isSecret": true + }, + { + "name": "EMBEDDINGS_PROVIDER", + "description": "Embeddings provider (e.g. ollama, openai, voyageai)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "EMBEDDINGS_MODEL", + "description": "Embeddings model name (provider-specific)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "EMBEDDINGS_VECTOR_DIM", + "description": "Embedding vector dimension (must match model)", + "format": "number", + "isRequired": false, + "isSecret": false + }, + { + "name": "QA_PROVIDER", + "description": "Question answering provider (e.g. ollama, openai, anthropic)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "QA_MODEL", + "description": "Question answering model name (provider-specific)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "RESEARCH_PROVIDER", + "description": "Research provider for multi-agent research (e.g. ollama, openai, anthropic)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "RESEARCH_MODEL", + "description": "Research model name for multi-agent research (provider-specific)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "RERANK_PROVIDER", + "description": "Rerank provider (e.g. mixedbread, cohere)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "RERANK_MODEL", + "description": "Rerank model name (provider-specific)", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "CHUNK_SIZE", + "description": "Chunk size for splitting documents (characters)", + "format": "number", + "isRequired": false, + "isSecret": false + }, + { + "name": "CONTEXT_CHUNK_RADIUS", + "description": "Number of adjacent chunks to include around search hits", + "format": "number", + "isRequired": false, + "isSecret": false + }, + { + "name": "OLLAMA_BASE_URL", + "description": "Base URL for Ollama server", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "VLLM_EMBEDDINGS_BASE_URL", + "description": "Base URL for vLLM embeddings endpoint", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "VLLM_RERANK_BASE_URL", + "description": "Base URL for vLLM rerank endpoint", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "VLLM_QA_BASE_URL", + "description": "Base URL for vLLM QA endpoint", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "VLLM_RESEARCH_BASE_URL", + "description": "Base URL for vLLM research endpoint", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "MARKDOWN_PREPROCESSOR", + "description": "Dotted path or file path to a callable that preprocesses markdown content before chunking", + "format": "string", + "isRequired": false, + "isSecret": false + }, + { + "name": "DISABLE_DB_AUTOCREATE", + "description": "If true, refuse to auto-create a new LanceDB database or tables", + "format": "boolean", + "isRequired": false, + "isSecret": false + }, + { + "name": "VACUUM_RETENTION_SECONDS", + "description": "Vacuum retention threshold in seconds (default: 60)", + "format": "number", + "isRequired": false, + "isSecret": false + }, + { + "name": "OPENAI_API_KEY", + "description": "OpenAI API key (if using OpenAI for embeddings or QA)", + "format": "string", + "isRequired": false, + "isSecret": true + }, + { + "name": "VOYAGE_API_KEY", + "description": "VoyageAI API key (if using VoyageAI for embeddings)", + "format": "string", + "isRequired": false, + "isSecret": true + }, + { + "name": "ANTHROPIC_API_KEY", + "description": "Anthropic API key (if using Anthropic for QA)", + "format": "string", + "isRequired": false, + "isSecret": true + }, + { + "name": "COHERE_API_KEY", + "description": "Cohere API key (if using Cohere for reranking)", + "format": "string", + "isRequired": false, + "isSecret": true + } + ] + } + ] + }, + "transports": [ + { + "type": "stdio" + } + ] +}