About Synamcps Server
Synamcps Server is an MCP server published by synamcps in the Developer Tools category: universal corporate AI-tools memory MCP server.
The repository has 4 stars and 0 forks, with the last commit a month ago. Recent commit activity is the strongest signal that reported issues will get attention.
Install
git clone https://github.com/synamcps/synamcps-serverThis server has no ConduID identity, so agent calls to it are not receipted. Pin the version you install and review the source before granting it credentials.
Ask AI
Ask AI about Synamcps Server
Powered by Claude · Grounded in docs
Security checks
- ✓README presentThe repository ships documentation.
5 checks have not been run yet.
README
Synamcps (SynaMCPs) — MCP + Knowledge Storage Gateway
Synamcps is a server that provides:
- An MCP server for LLM clients (Cursor / Claude Desktop / Claude Code / etc.)
- An HTTP API to create/search/read knowledge items
- A Web Admin UI to manage users/groups/storages/tokens, view status, and do basic diagnostics
- Token-based access to storages (tokens only narrow permissions), with ACL/RBAC, rate limiting, and usage/metrics
The server supports multiple auth methods (OIDC/Keycloak/Google/Teleport Proxy JWT) and an internal login for the Admin UI.
Quick start (Docker Compose)
Requirements:
- Docker + Docker Compose
Run:
cp .env.example .env
make compose-up
Open:
- Web UI:
http://localhost:8080/login - MCP endpoint (streamable):
http://localhost:8080/mcp - HTTP API:
http://localhost:8080/api/*
Stop:
make compose-down
Local run (without Docker)
Requirements:
- Go 1.23+
- Postgres, Redis, S3/MinIO available (or use Docker Compose as your infrastructure)
export CONFIG_PATH=configs/config.local.yaml
go run ./cmd/server
Features (high level)
Storages, ACL and tokens
- Storage is a logical entity tied to:
- records in the metadata catalog (Postgres)
- an S3 prefix (
storage.S3Prefix) - search scoping (vector backend: pgvector/qdrant)
- ACL bindings define user/group access to a storage (read/write/admin/owner).
- Access tokens:
- belong to a user (owner)
- do not expand permissions — they narrow the owner's access (intersection of user ACL and token scopes)
- can restrict:
storageIds,maxMode(read/read_write),toolAllowlist, rate limits.
Knowledge items
- You can add an item as:
- Text (via the standard
POST /api/knowledge) - File (upload → raw stored to S3 → best-effort extraction → summary+embeddings → item saved to storage)
- Link (download → raw stored to S3 → extraction → summary+embeddings → item saved to storage)
- Text (via the standard
MCP
- MCP exposes a dynamic
tools/listbased on the bearer token (only allowed tools/storages are visible). - Supports Streamable HTTP transport (
/mcp) and optional legacy SSE. - MCP tool names use
_(underscore) to avoid filtering/warnings in some clients.
Usage / Rate limit / Metrics
- Rate limiting per token (minute/hour/day + burst).
- Usage events (and status/errors) can be written to Redis TimeSeries (when enabled).
/metricsexposes Prometheus-format metrics.
Web Admin UI
The built-in admin UI (server-rendered HTML) lets you:
- Users / Groups / Group members
- Storages + Storage details (ACL, keys/tokens, items list)
- Tokens + MCP Connect wizard + delete
- Add item (Text/File/Link)
- Search (by token / by storage)
- Status (Postgres/Redis/S3/LLMs + error counters)
Configuration
Default config: configs/config.example.yaml
Override: CONFIG_PATH=/path/to/config.yaml
Key sections:
web.default_admin: Admin UI username/password (password via env ref)oauth.providers: OIDC providers (issuer/audience/jwks_url)teleport: Teleport Proxy JWT (issuer/audience)redis: sessions + usage/time-series (when enabled)s3: endpoint/bucket + large document thresholdembedding,summarization: LLMs (provider/model/api/api_key_env_ref)vector_backend.active:pgvectororqdrantmetadata_catalog.dsn: Postgres DSNapi.allowed_origins: strict CORS allowlistusage: accounting and time series, retention, exporters
Example .env for local development: .env.example.
HTTP API
Authentication:
- cookieAuth: web UI session (
session_idcookie) - bearerAuth:
Authorization: Bearer <token>
Common error codes:
401— missing token/session403— forbidden (insufficient permissions for the storage/operation)404— not found422— invalid request
Knowledge API
GET /api/knowledge
List items with pagination and filters.
Query params:
page(int)pageSize(int)storageId(string) — limit to a specific storagesource(string) — exact matchsourceUrl(string)sourceUrlMode(exact|partial) —partialworks only whensearch.filters.source_url.allow_partial_match=true
Response: models.PaginatedKnowledgeList (items + total + hasNext + page/pageSize).
POST /api/knowledge
Create an item from text.
Body:
{
"storageId": "storage-id-optional",
"title": "Runbook",
"text": "Long knowledge text...",
"mimeType": "text/plain",
"visibility": "personal",
"groupIds": [],
"source": "api",
"sourceUrl": "https://docs.example.com/runbook"
}
Notes:
- if
storageIdis empty and access-service is enabled, the server uses/creates the user's personal storage visibilitydefaults topersonalgroupIdsmust be an array (notnull)
GET /api/knowledge/{docId}
Return a single document.
DELETE /api/knowledge/{docId}
Delete a document (and associated embeddings in the vector store).
POST /api/knowledge/search
Embedding-based search.
Body:
{
"query": "kubernetes ingress timeout",
"topK": 10,
"filters": {
"storageId": "storage-id-optional",
"source": "api",
"sourceUrl": "https://...",
"sourceUrlMode": "exact"
}
}
Response: an array of search hits (including snippet/title/source/sourceUrl).
Ingest API (File/Link)
POST /api/knowledge/ingest/file (multipart)
Upload a file as an item:
- raw content is stored in S3
- best-effort text extraction is performed
- the pipeline produces summary + embeddings
- the final result is saved as a normal knowledge item
Multipart fields:
storageId(string, optional)title(string, optional)visibility(personal|group|public, optional)source(string, optional)sourceUrl(string, optional)mimeType(string, optional)file(required)
Example:
curl -X POST http://localhost:8080/api/knowledge/ingest/file \
-H "Authorization: Bearer $TOKEN" \
-F "storageId=..." \
-F "title=Spec" \
-F "visibility=personal" \
-F "file=@./spec.txt"
POST /api/knowledge/ingest/link (json)
Downloads a URL, stores raw content to S3, extracts text, and saves an item.
Body:
{
"storageId": "storage-id-optional",
"title": "Optional title",
"url": "https://example.com/docs",
"visibility": "personal",
"source": "link"
}
Admin API (/api/admin/*)
All endpoints require authentication (cookie or bearer), and many require platform_admin.
Users
GET /api/admin/meGET /api/admin/users(platform_admin)POST /api/admin/users(platform_admin)GET /api/admin/users/{id}(admin или сам пользователь)PATCH /api/admin/users/{id}(admin или сам пользователь)POST /api/admin/users/{id}/password(admin или сам пользователь)DELETE /api/admin/users/{id}(platform_admin)
Groups
GET /api/admin/groups(platform_admin)POST /api/admin/groups(platform_admin)DELETE /api/admin/groups/{id}(platform_admin)GET /api/admin/groups/{id}/membersPUT /api/admin/groups/{id}/members/{userId}DELETE /api/admin/groups/{id}/members/{userId}
Storages
GET /api/admin/storages(storages available to the current user)POST /api/admin/storagesDELETE /api/admin/storages/{id}GET /api/admin/storages/{id}(storage details: storage + acl + tokens)GET /api/admin/storages/{id}/aclPUT /api/admin/storages/{id}/acl
Tokens
GET /api/admin/tokensPOST /api/admin/tokensDELETE /api/admin/tokens/{id}PATCH /api/admin/tokens/{id}/rate-limitPOST /api/admin/tokens/{id}/revokePOST /api/admin/tokens/{id}/rotateGET/POST /api/admin/tokens/{id}/connect-options(wizard для MCP клиентов)
Usage / Status
GET /api/admin/usage/seriesGET /api/admin/usage/summaryGET /api/admin/status— component status + error counters (Redis TimeSeries)
MCP
Transport
- Streamable HTTP:
POST /mcp(JSON-RPC) +GET /mcp(SSE stream поMcp-Session-Id) - Legacy SSE (если включено):
/sse+/messages
Minimal flow (streamable)
- Obtain a bearer token (OIDC/Teleport/or internal)
initialize:
curl -X POST http://localhost:8080/mcp \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":"1","method":"initialize","params":{}}'
- Save
Mcp-Session-Idfrom headers/response (clients do this automatically) - Open the stream:
curl -N http://localhost:8080/mcp -H "Mcp-Session-Id: <session_id>"
Dynamic tools/list
tools/list returns only the tools allowed by the current bearer token and its storage scopes.
tools/call
tools/call routes calls to the corresponding internal methods (knowledge_* etc.).
MCP Connect (Web UI)
The Admin UI includes an MCP Connect page that generates:
- config file name
configBody(JSON)- step-by-step instructions
You can copy configBody by clicking it.
Installation and operations
Docker Compose
cp .env.example .env
make compose-up
Helpful:
make compose-downmake seed-dev(if used in your environment)
Config and secrets
configs/config.example.yaml— example configconfigs/config.local.yaml— local compose config (used indocker-compose.yml).env— secrets (passwords/keys), example in.env.example
CORS
api.allowed_origins is a strict allowlist. Unknown origins are rejected.
Web UI routes (/, /login, /logout, /app*) bypass the origin check.
Troubleshooting
- Origin not allowed:
- add the origin to
api.allowed_origins - make sure you open the Web UI via
/login(web routes bypass origin-check)
- add the origin to
- Invalid credentials:
- verify
.envis loaded (in compose it is wired viaenv_file: .env) - verify
web.default_admin.password_env_ref
- verify
- Time series are not created:
- you need Redis with the RedisTimeSeries module (
TS.ADDmust be supported) - or disable
usage.redis_timeseries
- you need Redis with the RedisTimeSeries module (
- MCP tools “filtered out” warning:
- tool names already use
_instead of.
- tool names already use
Documentation in this repo
docs/setup.md— installation and rundocs/api.md— basic knowledge endpointsdocs/mcp-connection.md— MCP connectiondocs/auth-setup.md— auth providersdocs/openapi.yaml— baseline OpenAPI stub
README copy captured when this server was indexed; it may lag the repository. The original is authoritative.