ai-armory
README.md
<div align="center">
<img src="docs/assets/banner.svg" alt="AI Armory: MCP tool sets, written once in plain Python" width="100%">
<br>
[](LICENSE)
[](pyproject.toml)
[](docs/serving.md)
[](docs/serving.md#-in-process-claude-agent-sdk)
**[๐ Serving](docs/serving.md)** ยท **[๐ฌ Google](docs/google.md)** ยท **[๐ Mac](docs/mac.md)** ยท **[๐งฉ Writing a tool set](docs/toolsets.md)** ยท **[๐ค Contributing](CONTRIBUTING.md)**
</div>
---
AI Armory is a **collection of MCP tool sets**: Google Workspace and Mac control today, with GitHub and more planned.
Each tool set is a **separate module you can load on its own**, written in **plain Python with no MCP imports**.
Load the ones you want, then serve them **in-process to the Claude Agent SDK** or **over stdio to any MCP client**.
<table>
<tr>
<td width="33%" valign="top">
### ๐ Plain Python
A tool is an `async` function plus a JSON Schema. No MCP library in sight.
</td>
<td width="33%" valign="top">
### ๐ฆ Only what you use
Each tool set has **its own extra**, so you install only its dependencies.
</td>
<td width="33%" valign="top">
### ๐ Safe by design
Sends and deletes are **flagged for the host to confirm**. AI Armory never prompts.
</td>
</tr>
</table>
## โจ Tool sets
<table>
<tr>
<td width="50%" valign="top">
**[๐ฌ Google Workspace](docs/google.md)**<br>
`gmail` ยท `calendar` ยท `chat` ยท `docs` ยท `sheets` ยท `slides` ยท `drive` across **any number of accounts**, or all seven as the `google` group.
</td>
<td width="50%" valign="top">
**[๐ Mac](docs/mac.md)**<br>
Notifications, apps and links, Apple Shortcuts, the volume and the clipboard on this Mac. **Nothing to configure.**
</td>
</tr>
<tr>
<td width="50%" valign="top">
**โฐ Clock**<br>
`clock`: the current date and time, in any IANA time zone.
</td>
<td width="50%" valign="top">
**[๐งฉ Your own](docs/toolsets.md)**<br>
Add a module here, or ship one in **another package** through an entry point.
</td>
</tr>
</table>
## ๐งญ How it fits together
```mermaid
flowchart TB
google["๐ฌ google<br/>gmail ยท calendar ยท chat ยท docs<br/>sheets ยท slides ยท drive"]
mac["๐ mac"]
clock["โฐ clock"]
plugin["๐ your package<br/>via entry point"]
registry[["๐ registry ยท load_many()"]]
subgraph Adapters["๐ Adapters"]
direction LR
sdk["๐ claude_sdk.py<br/>create_sdk_server()"]
stdio["๐ฅ๏ธ stdio.py<br/>ai-armory serve"]
end
agent(["๐ค Claude Agent SDK apps"])
clients(["๐ฌ Claude Desktop ยท Claude Code<br/>any MCP client"])
google & mac & clock --> registry
plugin -.-> registry
registry --> sdk & stdio
sdk -->|"in-process"| agent
stdio -->|"stdio"| clients
classDef set fill:#e0f2fe,stroke:#0284c7,color:#0c4a6e
classDef ext fill:#f1f5f9,stroke:#64748b,stroke-dasharray:5 4,color:#0f172a
classDef core fill:#ede9fe,stroke:#7c3aed,color:#2e1065
classDef adapter fill:#fff7ed,stroke:#ea580c,color:#7c2d12
classDef host fill:#ecfdf5,stroke:#059669,color:#064e3b
class google,mac,clock set
class plugin ext
class registry core
class sdk,stdio adapter
class agent,clients host
style Adapters fill:#f8fafc,stroke:#94a3b8,color:#334155
```
- **Tool sets** (blue) are plain Python with no MCP imports; the **registry** loads them **by name**.
- **Adapters** turn the same tool sets into an in-process SDK server or a stdio MCP server.
| Mode | Built on | Typical host |
|---|---|---|
| **In-process** | [Claude Agent SDK](https://github.com/anthropics/claude-agent-sdk-python) MCP server | Your own Agent SDK app, e.g. a voice assistant |
| **Standalone** | Official [`mcp`](https://github.com/modelcontextprotocol/python-sdk) SDK, over stdio | Claude Desktop, Claude Code, any MCP client |
## ๐ Quickstart
> [!IMPORTANT]
> Needs **Python 3.11+**. The `mac` tool set works only on macOS; the rest run anywhere.
**1. Install** โ clone, then install everything or just the [extras](#-install-extras) you need:
```sh
git clone https://github.com/anilkumarmeena/ai-armory
cd ai-armory
pip install -e ".[all]"
```
**2. Look around** โ list the tool sets this install can load:
```sh
ai-armory list
```
**3. Connect a client** โ for example, Claude Code serving the clock:
```sh
claude mcp add ai-armory -- ai-armory serve --toolsets clock
```
> [!TIP]
> Claude Desktop config, the in-process adapter and how confirmation reaches the host are in **[๐ Serving](docs/serving.md)**.
> The Google tool sets need a one-time sign-in: see **[๐ฌ Google โบ Configure](docs/google.md#-configure)**.
## ๐ฆ Install extras
```sh
pip install -e ".[all]" # everything
pip install -e ".[sdk,clock]" # the Agent SDK adapter and the clock tool set
pip install -e ".[google]" # the Google tool sets (gmail, calendar, chat, docs, sheets, slides, drive)
```
| Extra | Installs |
|---|---|
| `sdk` | `claude-agent-sdk`, for the in-process adapter |
| `clock` | the `clock` tool set |
| `google` | the Google client libraries, shared by all seven Google tool sets |
| `gmail` ยท `calendar` ยท `chat` ยท `docs` ยท `sheets` ยท `slides` ยท `drive` | the same as `google` |
| `mac` | nothing more: `mac` runs macOS's own programs |
| `all` | `sdk` + `clock` + `google` + `mac` |
| `dev` | `all` + `pytest` + `anyio` |
## ๐งฐ Everyday commands
| | Command | What it does |
|:-:|---|---|
| ๐ | `ai-armory list` | See the tool sets |
| ๐ | `ai-armory serve --toolsets clock` | Serve chosen tool sets over stdio |
| ๐ฌ | `ai-armory serve --toolsets google` | A group: all seven Google tool sets |
| โ | `ai-armory serve --toolsets mac,clock` | Several, comma-separated |
| ๐ | `ai-armory serve` | Serve every installed tool set |
| ๐ | `python -m ai_armory.toolsets.google login work` | Sign a Google account in |
- `serve --name <name>` sets the server name reported to the client (default `ai-armory`).
## ๐ Documentation
<table>
<tr>
<td width="50%" valign="top">
**[๐ Serving](docs/serving.md)**<br>
Standalone over stdio, in-process with the Agent SDK, and how confirmation reaches the host.
</td>
<td width="50%" valign="top">
**[๐ฌ Google](docs/google.md)**<br>
Every Google tool, accounts, the draft-then-confirm flow, and setup.
</td>
</tr>
<tr>
<td width="50%" valign="top">
**[๐ Mac](docs/mac.md)**<br>
The seven Mac tools, what each runs, and macOS permissions.
</td>
<td width="50%" valign="top">
**[๐งฉ Writing a tool set](docs/toolsets.md)**<br>
Adding a tool set, plugins from other packages, the code layout and tests.
</td>
</tr>
</table>
## ๐ Safety at a glance
- Tools that send, delete or otherwise act on the world are declared **`needs_confirmation=True`**; the host gates them.
- Google sends and deletes are **two tools: draft, then confirm**, and a draft can be used once at most.
- Nothing here **sends email without a confirmed draft**, **trashes mail**, **deletes a document, spreadsheet, deck or row**, or **changes, shares or deletes a Drive file**.
- Tools that return other people's text tell the model **not to follow instructions in it**.
Details: [๐ Serving โบ Confirmation](docs/serving.md#-confirmation) and [๐ฌ Google โบ Draft, then confirm](docs/google.md#-sends-and-deletes-draft-then-confirm).
## ๐งช Development
```sh
pip install -e ".[dev]"
pytest
```
See **[๐งฉ Writing a tool set](docs/toolsets.md)** to add your own.
## ๐ค Contributing
Issues and pull requests are welcome. **[๐ค Contributing](CONTRIBUTING.md)** covers setup with uv, the checks, code style and what makes a pull request easy to merge.
## ๐ License
**MIT**, see [LICENSE](LICENSE).
---
<div align="center">
<img src="docs/assets/logo.svg" width="48" alt="">
<sub>AI Armory ยท tools for agents, written once</sub>
</div>
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues