Skip to main content
Glama

Kiwi MCP - Unified AI Agent Tools

A unified MCP (Model Context Protocol) server consolidating directives, scripts, and knowledge management into 4 simple tools.

Status: ✅ Ready for Production
Version: 0.1.0
Coverage: >85%


Overview

Kiwi MCP reduces 17 tools from three separate MCPs into 4 unified tools with consistent interfaces:

Tool

Purpose

search

Find directives, scripts, or knowledge entries (local or registry)

load

Download items from registry to local storage

execute

Run operations: publish, delete, create, update, link, run

help

Get usage guidance and troubleshooting

Supported Types:

  • directive - Workflow guides and configurations

  • script - Python execution scripts

  • knowledge - Zettelkasten knowledge entries


Installation

Prerequisites

  • Python ≥3.11

  • pip or poetry

From Source

cd kiwi-mcp
pip install -e ".[dev]"

Dependencies

  • mcp>=1.0.0 - Model Context Protocol

  • pydantic>=2.0.0 - Data validation

  • httpx>=0.27.0 - HTTP client

  • supabase>=2.0.0 - Registry backend

  • python-dotenv>=1.0.0 - Environment configuration

  • pyyaml>=6.0.0 - YAML parsing

  • aiofiles>=23.0.0 - Async file I/O


Quick Start

Initialize

export SUPABASE_URL="https://your-project.supabase.co"
export SUPABASE_SECRET_KEY="your-secret-key"

# Run server
python -m kiwi_mcp.server

Usage Examples

Search for Directives

{
  "tool": "search",
  "arguments": {
    "item_type": "directive",
    "query": "authentication setup",
    "source": "registry",
    "limit": 10
  }
}

Response:

{
  "results": [
    {
      "name": "oauth_setup",
      "category": "authentication",
      "description": "Setup OAuth with Google and GitHub",
      "quality_score": 95.0
    }
  ]
}

Load a Script

{
  "tool": "load",
  "arguments": {
    "item_type": "script",
    "item_id": "google_maps_scraper",
    "destination": "project",
    "project_path": "/home/user/myproject"
  }
}

Response:

{
  "status": "loaded",
  "name": "google_maps_scraper",
  "version": "2.1.0",
  "destination": "project",
  "path": "/home/user/myproject/.ai/scripts/scraping/google_maps_scraper.py"
}

Run a Directive

{
  "tool": "execute",
  "arguments": {
    "item_type": "directive",
    "action": "run",
    "item_id": "bootstrap_project",
    "parameters": {
      "project_name": "my_app",
      "language": "python"
    }
  }
}

Response:

{
  "action": "run",
  "name": "bootstrap_project",
  "source": "local",
  "content": "# Bootstrap Directive\n1. Create project structure...",
  "instructions": "Follow the directive steps above."
}

Publish to Registry

{
  "tool": "execute",
  "arguments": {
    "item_type": "knowledge",
    "action": "publish",
    "item_id": "001-email-deliverability",
    "parameters": {
      "version": "1.0.0",
      "changelog": "Initial release with best practices"
    }
  }
}

Tools Reference

Find items by natural language query across local and registry sources.

Parameters:

  • item_type (required): "directive", "script", or "knowledge"

  • query (required): Natural language search query

  • source (optional): "local", "registry", or "all" (default: "local")

  • limit (optional): Max results (default: 10)

Returns: JSON with results array or error

Examples:

# Search for email-related knowledge
search(
    item_type="knowledge",
    query="email deliverability",
    source="registry"
)

# Search local scripts
search(
    item_type="script",
    query="scrape Google Maps",
    limit=5
)

load

Download items from registry to local storage.

Parameters:

  • item_type (required): "directive", "script", or "knowledge"

  • item_id (required): Item identifier

  • destination (optional): "project" or "user" (default: "project")

  • project_path (optional): Required if destination="project"

  • version (optional): Specific version to load

Returns: JSON with status, path, and metadata

Examples:

# Load directive to project
load(
    item_type="directive",
    item_id="oauth_setup",
    destination="project",
    project_path="/home/user/myapp"
)

# Load knowledge to user space
load(
    item_type="knowledge",
    item_id="001-jwt-auth",
    destination="user"
)

execute

Run operations on items: run, publish, delete, create, update, link.

Parameters:

  • item_type (required): "directive", "script", or "knowledge"

  • action (required): "run", "publish", "delete", "create", "update", "link"

  • item_id (required): Item identifier

  • parameters (optional): Action-specific parameters dict

  • Additional parameters: dry_run, project_path, etc.

Returns: JSON with operation result or error

Supported Actions (All Types):

All item types support the same 6 actions for consistency:

  • run - Execute/load the item (directives return parsed content, scripts execute with params, knowledge returns entry)

  • publish - Publish to registry with version

  • delete - Remove from local or registry (requires confirm: true)

  • create - Create new item locally

  • update - Modify existing item

  • link - Link to another item of the same type (e.g., directive → directive, script → script)

Type-Specific Behavior:

Action

Directive

Script

Knowledge

run

Returns parsed XML content

Executes in venv with params

Returns entry content

publish

Creates version with content_hash

Uploads .py file with metadata

Publishes with tags

link

requires, suggests, extends

depends_on, imports

references, contradicts, extends

Examples:

# Run a directive
execute(
    item_type="directive",
    action="run",
    item_id="setup_auth",
    parameters={"provider": "google"}
)

# Publish script to registry
execute(
    item_type="script",
    action="publish",
    item_id="my_scraper",
    parameters={"version": "1.0.0"}
)

# Delete with confirmation
execute(
    item_type="knowledge",
    action="delete",
    item_id="001-old-entry",
    parameters={"confirm": True}
)

help

Get usage guidance, examples, and troubleshooting.

Parameters:

  • topic (optional): Specific topic for help

Returns: JSON with help text

Examples:

# General help
help()

# Help for search tool
help(topic="search")

# Help for directive workflows
help(topic="directive")

Configuration

Environment Variables

# Supabase registry (optional)
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SECRET_KEY=your-secret-key

# User space directory (optional, defaults to ~/.ai)
USER_SPACE=~/.ai

# Log level
LOG_LEVEL=INFO

.env Files

Environment variables can be loaded from hierarchical .env files:

# Userspace defaults (applies to all projects)
~/.ai/.env

# Project-specific overrides
.ai/.env

Scripts automatically load both files in order (userspace → project → runtime).


Script Execution Features

Virtual Environment Isolation

Scripts run in isolated virtual environments:

  • Project scripts: .ai/scripts/.venv/

  • Userspace scripts: ~/.ai/.venv/

Each environment is automatically created and managed.

Dependency Auto-Install

Dependencies are automatically detected and installed:

  • From script import statements

  • From lib module imports

  • Supports version constraints

# Script automatically installs: requests, beautifulsoup4
import requests
from bs4 import BeautifulSoup
from lib.http_session import get_session  # Also installs lib dependencies

Shared Libraries

Scripts can import from shared library modules:

# Project lib (priority)
from lib.project_utils import helper

# Userspace lib (fallback)
from lib.http_session import get_session
from lib.youtube_utils import extract_video_id

Library locations:

  • .ai/scripts/lib/ (project)

  • ~/.ai/scripts/lib/ (userspace)

Output Management

Large script outputs are automatically saved:

  • Project: .ai/outputs/scripts/{script_name}/

  • Userspace: ~/.ai/outputs/scripts/{script_name}/

  • Keeps last 10 outputs per script

  • Auto-truncates MCP responses >1MB


Architecture

┌─────────────────────────────────────────────────────────────┐
│                     MCP Server                              │
├──────────────┬──────────────┬──────────────┬────────────────┤
│   search     │     load     │   execute    │      help      │
└──────┬───────┴──────┬───────┴──────┬───────┴────────┬───────┘
       │              │              │                │
       └──────────────┴──────────────┴────────────────┘
              TypeHandlerRegistry
       ┌──────────┬──────────┬──────────┐
       │          │          │          │
   Directive   Script    Knowledge    (Future)
   Handler     Handler    Handler
       │          │          │
       ├──────────┼──────────┤
       │  Local + Registry Storage

Project Structure

kiwi-mcp/
├── kiwi_mcp/
│   ├── __init__.py              # Package
│   ├── server.py                # MCP server entry
│   ├── tools/                   # 4 unified tools
│   │   ├── base.py              # BaseTool abstract class
│   │   ├── search.py            # SearchTool
│   │   ├── load.py              # LoadTool
│   │   ├── execute.py           # ExecuteTool
│   │   └── help.py              # HelpTool
│   ├── handlers/                # Type-specific handlers
│   │   ├── registry.py          # TypeHandlerRegistry
│   │   ├── directive/           # Directive handlers
│   │   ├── script/              # Script handlers
│   │   └── knowledge/           # Knowledge handlers
│   ├── api/                     # Registry clients
│   │   ├── directive_registry.py
│   │   ├── script_registry.py
│   │   └── knowledge_registry.py
│   └── utils/                   # Shared utilities
├── tests/
│   ├── unit/
│   │   ├── test_tools.py        # Tool tests (20+)
│   │   └── test_handlers.py     # Handler tests (20+)
│   └── integration/
├── docs/                        # Documentation
├── README.md                    # This file
├── pytest.ini
└── pyproject.toml

Testing

Run All Tests

pytest tests/ -v

Run Unit Tests Only

pytest tests/unit/ -v

Coverage Report

pytest tests/ -v --cov=kiwi_mcp --cov-report=html
# Open htmlcov/index.html

Coverage Target

  • Goal: >85% code coverage

  • Current: ✅ Achieved


Development

Install Dev Dependencies

pip install -e ".[dev]"

Code Quality

# Linting
ruff check kiwi_mcp/

# Format
ruff format kiwi_mcp/

# Type checking
mypy kiwi_mcp/ --ignore-missing-imports

Running Locally

# Development server
python -m kiwi_mcp.server

# Or with auto-reload
pytest-watch tests/

API Reference

Item Types

directive

  • Location: .ai/directives/ (project) or ~/.ai/directives/ (user)

  • Format: Markdown with YAML frontmatter

  • Operations: search, load, run, publish, delete, create, update

script

  • Location: .ai/scripts/ (project) or ~/.ai/scripts/ (user)

  • Format: Python (.py)

  • Operations: search, load, run, publish, delete

  • Features: venv isolation, auto-install dependencies, lib imports, .env loading

knowledge

  • Location: .ai/knowledge/ (project) or ~/.ai/knowledge/ (user)

  • Format: Markdown with metadata

  • Operations: search, load, create, update, delete, link, publish

Sources

  • local - Search only in .ai/ directories

  • registry - Search only in Supabase registry

  • all - Search both local and registry (registry items marked separately)

Error Handling

All tools return consistent error responses:

{
  "error": "Description of what went wrong",
  "item_type": "directive",
  "message": "Human-readable message"
}

Troubleshooting

Import Errors

from kiwi_mcp import KiwiMCP
from kiwi_mcp.server import main

If imports fail:

  1. Check Python version: python --version (need ≥3.11)

  2. Reinstall: pip install -e .

No Supabase Connection

If registry is unavailable, local operations still work:

  • Search: Use source="local"

  • Load: Downloads from registry disabled

  • Execute: Local operations only

  • Use limit parameter to reduce results

  • Add more specific keywords

  • Filter by category/tags (see handler docs)


Contributing

  1. Write tests first

  2. Implement feature

  3. Run: pytest tests/ -v --cov=kiwi_mcp

  4. Check coverage >85%

  5. Lint: ruff check kiwi_mcp/


License

MIT License - see LICENSE file


Support

  • Documentation: docs/ARCHITECTURE.md, docs/API.md

  • Examples: See quick start above

  • Issues: GitHub issues


Roadmap

  • GraphQL registry queries

  • Authentication/authorization

  • Webhooks and real-time updates

  • Web UI for management

  • Plugin system for custom handlers

  • Vector search with RAG

-
security - not tested
F
license - not found
-
quality - not tested

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/leolilley/kiwi-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server