Skip to main content
Glama
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: MIT](https://img.shields.io/badge/license-MIT-a78bfa?style=flat-square)](LICENSE)
[![Python 3.11+](https://img.shields.io/badge/python-3.11%2B-3776ab?style=flat-square&logo=python&logoColor=white)](pyproject.toml)
[![MCP](https://img.shields.io/badge/MCP-stdio%20%7C%20in--process-7c3aed?style=flat-square)](docs/serving.md)
[![Claude Agent SDK](https://img.shields.io/badge/Claude%20Agent%20SDK-ready-d97706?style=flat-square)](docs/serving.md#-in-process-claude-agent-sdk)

**[๐Ÿ”Œ Serving](docs/serving.md)** &nbsp;ยท&nbsp; **[๐Ÿ“ฌ Google](docs/google.md)** &nbsp;ยท&nbsp; **[๐ŸŽ Mac](docs/mac.md)** &nbsp;ยท&nbsp; **[๐Ÿงฉ Writing a tool set](docs/toolsets.md)** &nbsp;ยท&nbsp; **[๐Ÿค 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>