Versions: * arcade-mcp\==1.0.0rc1 * arcade-mcp-server\==1.0.0rc1 * arcade-core\==2.5.0rc1 * arcade-tdk\==2.6.0rc1 * arcade-serve\==2.2.0rc1 ### Summary Adds first-class MCP support across Arcade, introduces a new MCP server and CLI, unifies the project under the arcade-mcp name, overhauls templates/scaffolding, and improves developer tooling, secrets management, and examples. ### Highlights - **MCP Server & Core** - New MCP server with stdio and HTTP/SSE transports, session management, resumability, and lifecycle handling. - FastAPI-like `MCPApp` for building servers with lazy init; integrated worker+MCP HTTP app option. - Middleware system (logging and error handling), robust exception hierarchy, and Pydantic-based settings. - Async-safe managers for tools, resources, and prompts backed by registries and locks. - Developer-facing, transport-agnostic runtime context interfaces (logs, tools, prompts, resources, sampling, UI, notifications). - Conversion from Arcade ToolDefinition to MCP tool schema; OpenAI JSON tool schema converter. - Parser supports `@app.tool`/`@app.tool(...)` decorators. - **CLI** - New `mcp` command to run MCP servers with stdio or HTTP/SSE. - New `secret` command to set/list/unset tool secrets (supports .env input, preserves original casing for lookups). - `new` command refactored; option to create a full toolkit package with scaffolding. - `chat` command removed. - `serve.py` imports updated to `arcade_serve.fastapi.telemetry`; version retrieval now uses `arcade-mcp`. - `show.py` refactor to use new local catalog utilities. - `display_tool_details` improved: adds “Default” column and handles nested properties. - **Configuration & Discovery** - New `configure.py` to set up Claude Desktop, Cursor, and VS Code to connect to local or Arcade Cloud MCP servers. - Discovery utilities to find/install toolkits, build `ToolCatalog`s, analyze files for tools, load kits from directories (pyproject parsing), and build minimal toolkits. - Better handling of provider API key resolution and evaluation suite loading. - **Templates & Scaffolding** - Reorganized template structure (minimal vs full); moved `.pre-commit-config.yaml`, `.ruff.toml`, license, Makefile, README, tests, and tools layout to correct paths. - Minimal template adds `.env.example` for runtime secret injection. - Template pyproject updated for MCP servers; includes sample server with greeting and secret-reveal tools. - Authorization flow in templates simplified. - **Repo-wide Renaming & Examples** - Migrates references from `arcade-ai` to `arcade-mcp` across READMEs, scripts, and package metadata. - Examples updated (LangChain/LangGraph/AI SDK/TypeScript) and package name changed to `arcade-mcp-sdk`. - **Evals & Core Utilities** - Evals now use OpenAI tooling format (`OpenAIToolList`, `to_openai`); `tool_eval` takes `provider_api_key`. - Core utilities: fixed `does_function_return_value` by dedenting before parse; version bump to `2.5.0rc1` and dependency cleanup. - **Tooling & CI** - `setup-uv-env` action splits toolkit vs contrib dependency installation. - Pre-commit: excludes `libs/arcade-mcp-server/mkdocs.yml` and `libs/tests/` from YAML and Ruff hooks; Ruff per-file ignores (e.g., C901 in `libs/**/*.py`, TRY400 in server docs paths). - Makefile updates for uv env setup, quality checks, tests, builds, and new `shell` target. - Added Makefile to MCP server library to streamline dev workflow. - **Cleanup** - Removed `claude.json` config. - Simplified stdio entrypoint; removed unused imports (`arcade_gmail`, `arcade_search`). ### Breaking Changes - **CLI**: `chat` command removed; use `mcp`, `secret`, and updated `new`. - **Naming**: All users should update references from `arcade-ai` to `arcade-mcp`. - **Templates**: File paths moved; downstream scripts referencing old template locations may need updates. ### Getting Started - Run an MCP server: - `arcade mcp --stdio --toolkits your_toolkit` - `arcade mcp --http --toolkits your_toolkit` - Manage secrets: - `arcade secret set your_toolkit KEY=value` - `arcade secret list your_toolkit` - `arcade secret unset your_toolkit KEY` - Configure clients: - `arcade configure` to set up Claude Desktop, Cursor, and VS Code for local/Arcade Cloud MCP. --------- Co-authored-by: Sam Partee <sam@arcade-ai.com> Co-authored-by: Shub <125150494+shubcodes@users.noreply.github.com>
74 lines
2.4 KiB
Docker
74 lines
2.4 KiB
Docker
FROM python:3.11-slim
|
|
|
|
# Define build arguments with default values
|
|
ARG PORT=8001
|
|
ARG HOST=0.0.0.0
|
|
ARG INSTALL_TOOLKITS=true
|
|
|
|
# Set environment variables using the build arguments
|
|
ENV PORT=${PORT}
|
|
ENV HOST=${HOST}
|
|
ENV OTEL_ENABLE=false
|
|
ENV ARCADE_WORK_DIR=/app
|
|
|
|
# Install system dependencies
|
|
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
|
|
libssl-dev \
|
|
python3-dev \
|
|
curl \
|
|
&& apt-get clean \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
RUN pip install --upgrade setuptools>=78.1.1
|
|
|
|
WORKDIR /app
|
|
|
|
# Copy the dist directory contents into the container
|
|
COPY ./dist /app/dist/
|
|
|
|
# Copy the toolkits.txt file into the container
|
|
COPY ./docker/toolkits.txt /app/
|
|
|
|
# Expose the port
|
|
EXPOSE $PORT
|
|
|
|
# List wheel files for debugging purposes
|
|
RUN ls -la /app/dist/
|
|
|
|
# Install the worker and CLI package
|
|
RUN python -m pip install \
|
|
/app/dist/arcade_serve-*.whl \
|
|
/app/dist/arcade_mcp-*.whl
|
|
/app/dist/arcade_mcp_server-*.whl
|
|
|
|
# Conditionally install toolkit wheels from dist directory if INSTALL_TOOLKITS is true and the toolkit is in toolkits.txt
|
|
RUN if [ "$INSTALL_TOOLKITS" = "true" ] ; then \
|
|
while IFS= read -r toolkit; do \
|
|
# Skip empty lines and comments (lines starting with #)
|
|
if [ -n "$toolkit" ] && [ "${toolkit#\#}" = "$toolkit" ]; then \
|
|
# Convert toolkit name to match wheel filename format (replace - with _)
|
|
wheel_name=$(echo "$toolkit" | sed 's/-/_/g'); \
|
|
wheel_file="/app/dist/${wheel_name}-"*.whl; \
|
|
# Check if this is not a core package and if the wheel file exists
|
|
if [ "$wheel_name" != "arcade_core" ] && \
|
|
[ "$wheel_name" != "arcade_serve" ] && \
|
|
[ "$wheel_name" != "arcade_mcp" ] && \
|
|
[ "$wheel_name" != "arcade_mcp_server" ] && \
|
|
[ "$wheel_name" != "arcade_tdk" ]; then \
|
|
if ls $wheel_file 1> /dev/null 2>&1; then \
|
|
echo "Installing $toolkit from $wheel_file"; \
|
|
python -m pip install $wheel_file; \
|
|
else \
|
|
echo "Warning: Wheel file not found for $toolkit (looked for $wheel_file)"; \
|
|
fi; \
|
|
else \
|
|
echo "Skipping core package: $toolkit"; \
|
|
fi; \
|
|
fi; \
|
|
done < /app/toolkits.txt ; \
|
|
fi
|
|
|
|
# Run the arcade worker
|
|
COPY docker/start.sh /app/start.sh
|
|
RUN chmod +x /app/start.sh
|
|
CMD ["/app/start.sh"]
|