Allye MCP Server
Python MCP server for Allye Cloud API integration
Quick Start • Installation • Configuration • Structure • Testing
Overview
Allye MCP connects MCP-compatible clients (Claude Code, Cursor, Windsurf, VS Code, etc.) directly to the Allye Cloud APIs. Every tool invocation hits the live backend—no outdated snapshots or hallucinated IDs.
Available Tools:
knowledge— Documentation CRUD, work items, modesskills— Authorized document library: create, read, edit, trash, and revision historyproductivity— TODO managementintelligence— Memories and smart operationsuser_config— User configuration documentsinitialize— Personalized setuphealth— Backend health checkprojects,epics,specs,tasks— Projects module (Project → Epic → Spec → Task)
Skills library
The default skills tool supports skill_list, skill_get, skill_create,
skill_update, skill_delete, skill_list_revisions, and skill_restore_revision.
Creation accepts name, content, scope (personal, team, or organization),
optional description, and optional category. Reading or saving uses skill_id;
restoring also uses the revision_id returned by history.
Reads show the latest authorized document, not only published releases. Delete moves a document to trash without erasing its history. Restore creates a new revision; it never changes an existing revision or the approved release pointer. The API enforces all permissions and company/team boundaries. The advanced Skills implementation is retained but not advertised by the default registry.
Projects (spec-driven work)
Four tools cover the Projects module: projects (projects and their apps,
including app_archive/app_unarchive), epics (status calculated from specs;
epic_cancel/epic_reopen), specs (18 actions: lifecycle transitions,
versions, diff, anchors, coverage, dependencies, spec_context, spec_stale) and
tasks (14 actions: CRUD, task_bulk_create, transitions, task_next).
Every entity is referenced by key (ALY, ALY-7, ALY-7.3) or UUID. There are
no free status changes and no deletes: only transition actions and cancel/reopen.
spec_approve requires user_requested=true and must only be used when the user
explicitly asks. Uncovered acceptance criteria never block; responses carry a
Warning: uncovered ACs line. The API enforces permissions (projects:select,
projects:insert, projects:update) and the HTTP contract lives in the allye-api
Projects plan §6. Work items, boards and sprints remain the separate legacy module.
Quick Start
Remote server with native OAuth (recommended)
Configure the server name allye with the canonical URL:
https://mcp.allye.app/mcp
Use the client's native MCP OAuth flow. Do not configure a fixed
Authorization header, PAT, legacy client ID, tenant path, or token helper.
The client discovers OAuth from:
https://mcp.allye.app/.well-known/oauth-protected-resource/mcp
Examples:
# Claude Code
claude mcp add --transport http allye https://mcp.allye.app/mcp
# Codex
codex mcp add allye --url https://mcp.allye.app/mcp
codex mcp login allye
For OpenCode, define an enabled remote server named allye at the same URL,
then run opencode mcp auth allye. With Pi and pi-mcp-adapter, configure the
same name and URL, then use /mcp-auth allye and /mcp reconnect allye.
Each installation completes its own browser authorization.
Local STDIO with an explicit PAT
PAT authentication remains supported only for local STDIO:
pipx install allye-mcp
ALLYE_TRANSPORT_MODE=stdio allye-mcp --pat <your-token>
Requirements
| Mode | Authentication | Client |
|---|---|---|
| Remote HTTP | Native OAuth v2 | OAuth-capable MCP client |
| Local STDIO | Explicit Allye PAT | Any STDIO-capable MCP client |
Python 3.10+ is required when running the server locally.
Installation
With pipx (recommended)
pipx install allye-mcp
With pip
pip install --user allye-mcp
Upgrade
pipx upgrade allye-mcp
# or
pip install --upgrade allye-mcp
Configuration
STDIO client setup
The PAT belongs only to the local STDIO process:
{
"mcpServers": {
"allye": {
"command": "allye-mcp",
"args": ["--pat", "your-token"],
"env": {
"ALLYE_TRANSPORT_MODE": "stdio"
}
}
}
}
ALLYE_PAT_TOKEN may replace --pat for STDIO. Never attach either credential
to an HTTP MCP request.
Environment variables
| Variable | Purpose | HTTP requirement |
|---|---|---|
ALLYE_API_URL |
Private Allye API listener used for delegated calls | Required |
ALLYE_AUTH_SERVER_URL |
OAuth issuer (https://api.allye.app/oauth/v2 in production) |
Required |
ALLYE_JWKS_URL |
Issuer JWKS endpoint (https://api.allye.app/oauth/v2/jwks) |
Required |
ALLYE_MCP_RESOURCE |
Public resource/audience (https://mcp.allye.app/mcp) |
Required |
ALLYE_INTERNAL_RESOURCE |
Private API audience (https://api.allye.app/internal/mcp) |
Required |
ALLYE_MCP_CLIENT_ID |
Internal client (allye-mcp-internal) |
Required |
ALLYE_MCP_CLIENT_SECRET |
Internal client secret from the secret manager | Required |
ALLYE_ALLOWED_ORIGINS |
JSON array of browser origins (production: ["https://allye.app"]) |
Required |
ALLYE_JWKS_CACHE_TTL |
Public-key cache duration in seconds | Default 3600 |
ALLYE_TRANSPORT_MODE |
stdio, http, or both |
Set to http or both |
ALLYE_HTTP_HOST |
HTTP bind host | Default 127.0.0.1 |
ALLYE_HTTP_PORT |
HTTP bind port | Default 3000 |
ALLYE_LOG_LEVEL |
DEBUG, INFO, WARNING, ERROR, or CRITICAL |
Default INFO |
ALLYE_PAT_TOKEN |
Local STDIO credential | Never used for HTTP |
See .env.example for the complete template.
HTTP resource-server operation
Supply all required values through the deployment secret/configuration manager,
then start without --pat:
export ALLYE_TRANSPORT_MODE=http
allye-mcp
The only MCP endpoint is POST /mcp. Protected-resource metadata is available
only at GET /.well-known/oauth-protected-resource/mcp; GET /mcp is not an
SSE transport. GET /health remains a public local diagnostic and grants no
tool access.
HTTP and STDIO can run together:
export ALLYE_TRANSPORT_MODE=both
export ALLYE_PAT_TOKEN=<stdio-only-token>
allye-mcp
The HTTP side still requires the full OAuth configuration and never falls back to that PAT. Missing startup configuration fails closed. If JWKS, service-token, grant activity, or required API authorization is unavailable, protected requests return HTTP 503; the server does not reinterpret the failure as an invalid user token, open a login flow, or run the tool.
Project Structure
allye-mcp-py/
├── allye_mcp/ # Main package
│ ├── main.py # Entry point (CLI)
│ ├── application/ # Use cases and services
│ ├── domain/ # Business entities
│ ├── infrastructure/ # External integrations (API, transport)
│ └── interface/ # MCP protocol handlers
├── tests/ # Test suite
├── docs/ # Documentation
├── pyproject.toml # Project configuration
└── .env.example # Environment template
allye_mcp/ — Package Structure
| Directory | Responsibility |
|---|---|
main.py |
CLI entry point, argument parsing, server bootstrap |
application/ |
Use cases, handlers for each MCP tool |
domain/ |
Business entities, DTOs, validation |
infrastructure/ |
API client, HTTP transport, logging |
interface/ |
MCP protocol implementation, tool registration |
Architecture
MCP Client → interface/ → application/ → infrastructure/ → Allye API
↓
domain/
(entities)
Tech Stack
| Layer | Technology |
|---|---|
| Runtime | Python 3.10+ |
| Validation | Pydantic 2 |
| HTTP | aiohttp, requests |
| Config | pydantic-settings |
| Testing | pytest, pytest-asyncio |
| Linting | flake8, black, mypy |
Development
Setup
# Clone and install
git clone <repo>
cd allye-mcp-py
pip install -e .[dev]
Scripts
| Command | Description |
|---|---|
pytest |
Run tests |
pytest --cov=allye_mcp |
Run with coverage |
black allye_mcp/ tests/ |
Format code |
flake8 allye_mcp/ tests/ |
Lint |
mypy allye_mcp/ |
Type check |
Commit Convention
Follow Conventional Commits:
| Prefix | Description | Version Bump |
|---|---|---|
fix: |
Bug fixes | Patch |
feat: |
New features | Minor |
BREAKING CHANGE: |
Breaking changes | Major |
chore: |
Maintenance | None |
docs: |
Documentation | None |
CI/CD
| Platform | Usage |
|---|---|
| GitHub Actions | Tests, lint, build on push/PR to main |
| Semantic Release | Auto-version based on commits |
| PyPI | Package distribution |
Troubleshooting
command not found: allye-mcp
Add scripts directory to PATH:
# macOS/Linux
export PATH="$PATH:~/.local/bin"
# Windows
# Add %APPDATA%\Python\Python311\Scripts to PATH
401 Unauthorized
- Remote HTTP: the grant or access token is no longer active. Use the
harness's native authentication command for the
allyeentry when you intentionally want to authorize again. Do not add a static bearer header. - Local STDIO: check the explicit
--patorALLYE_PAT_TOKENvalue.
503 Service Unavailable
OAuth activity could not be established safely. Keep the existing client registration and credentials, restore the issuer/JWKS/private API dependency, and retry. A 503 is not a signal to clear credentials or open a new browser authorization.
Run HTTP and STDIO simultaneously
Configure all HTTP OAuth variables, then provide a PAT only for the STDIO side:
export ALLYE_TRANSPORT_MODE=both
export ALLYE_PAT_TOKEN=<stdio-only-token>
allye-mcp
Security
- Keep the internal MCP client secret in the deployment secret manager.
- Let remote harnesses store OAuth credentials in their native credential store.
- Keep local STDIO PATs out of project configuration and version control.
- Never forward external bearer tokens to the Allye API.
- Revoke only the affected MCP grant when access is no longer needed.
- Use
pipxto isolate a local STDIO installation from global Python.
Useful Links
| Resource | URL |
|---|---|
| PyPI | https://pypi.org/project/allye-mcp/ |
| Allye Cloud | https://allye.devshire.app |
| MCP Protocol | https://modelcontextprotocol.io |
Metadata
Release files for allye-mcp 1.12.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| allye_mcp-1.12.1.tar.gz | 152.3 kB | Without provenance | Details for allye_mcp-1.12.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| allye_mcp-1.12.1-py3-none-any.whl | Python 3 | none | any | Details for allye_mcp-1.12.1-py3-none-any.whl |
Total release size: 341.3 kB
Release files / allye_mcp-1.12.1.tar.gz
| Download URL | allye_mcp-1.12.1.tar.gz |
|---|---|
| Size | 152.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b27166a961e662102c0676acaff0e6622231b9c33178a57c0693b41744bf9f0a
|
|
BLAKE2b-256 checksum How to use checksums |
007b2edc5d6055885beb827f8641126cd44d48ed8ab8149da37d8381f4ef7199
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Release files / allye_mcp-1.12.1-py3-none-any.whl
| Download URL | allye_mcp-1.12.1-py3-none-any.whl |
|---|---|
| Size | 189.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
16a481419cbcb60d98c29b6787569860b893ef8abe9a33da844462e60d7b5237
|
|
BLAKE2b-256 checksum How to use checksums |
56e6ad8960d458c7a6dee7f0b059beff84599f30ea4f1ed9705a01837f76fa1c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.16
|
Security for allye-mcp 1.12.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.