Skip to main content
Glama
samayyy

zee5-catalog-mcp

by samayyy
README.md
# zee5-mcp-public — Public Catalog MCP (FastMCP, Cloud Run)

Self-hosted **public catalog** MCP server for the Stream Discovery ADK agent.
Streamable-HTTP MCP (FastMCP 3.x), stateless, mounts at `/mcp`. All data is
**synthetic** (invented titles — no real catalog/PII).

Tools: `search_catalog`, `get_title_metadata`, `get_similar_titles`,
`get_trending`, `get_new_releases`.

## Deploy to Cloud Run (public, unauthenticated) — Singapore

```bash
export PROJECT_ID="gm-test-337806"
export REGION="asia-southeast1"

gcloud config set project "$PROJECT_ID"
gcloud services enable run.googleapis.com cloudbuild.googleapis.com artifactregistry.googleapis.com

git clone https://github.com/<you>/zee5-mcp-public.git && cd zee5-mcp-public

gcloud run deploy zee5-catalog-mcp \
  --source . \
  --region="$REGION" \
  --allow-unauthenticated \
  --min-instances=1 \
  --timeout=3600 \
  --no-cpu-throttling \
  --project="$PROJECT_ID"

# Capture the public URL (the MCP endpoint is <URL>/mcp):
gcloud run services describe zee5-catalog-mcp --region="$REGION" \
  --project="$PROJECT_ID" --format='value(status.url)'
```

> **If `--allow-unauthenticated` fails** with `One or more users named in the
> policy do not belong to a permitted customer` (org Domain-Restricted-Sharing),
> replace it with `--no-invoker-iam-check` (makes the service public without an
> `allUsers` IAM binding).

## Smoke test

```bash
URL=$(gcloud run services describe zee5-catalog-mcp --region="$REGION" --format='value(status.url)')
curl -s "$URL/mcp" -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | head -c 600
```

## Local run

```bash
pip install -r requirements.txt
PORT=8081 python server.py    # http://127.0.0.1:8081/mcp
```