otama

otama

An MCP server that lets AI assistants safely access local git repositories, with free reads and gated writes requiring explicit confirmation.

Category
访问服务器

README

otama

An MCP server that gives AI assistants — Cursor, Claude Desktop, or your own voice agent — access to your local git repositories.

Read operations run freely. Anything that writes returns a confirmation token and a plain-English summary first, and only acts when called a second time with that token. The assistant asks before it commits.

You:  commit my changes in api-service with message "fix auth timeout"
LLM:  Commit 3 changed files in api-service with message 'fix auth timeout'. Confirm?
You:  yes
LLM:  Committed — a4f21c9 fix auth timeout

Why

Most filesystem MCP servers give a model unrestricted read and write access to a directory tree. That is fine when you are watching every tool call. It is not fine when the model is driving a voice assistant, running unattended, or has just misheard you.

otama assumes the model will occasionally be wrong and makes the consequences small:

  • A path sandbox. Every path is resolved before it is checked against your configured roots. .., symlinks and absolute paths cannot escape.
  • Two-phase confirmation. Write and execute tools called without a token do nothing but describe what they would do. Tokens are single-use, expire after two minutes, and are bound to the tool that issued them.
  • A command allowlist. run_command refuses anything outside the list outright rather than offering it for confirmation. A mishearing should never be one "yes" away from rm -rf.

Install

Requires Python 3.11+ and git on PATH.

git clone https://github.com/Ronith2906/otama.git
cd otama
python -m venv .venv
.venv/bin/pip install -r requirements.txt          # Windows: .venv\Scripts\pip.exe
cp otama.example.toml otama.toml

Edit otama.toml and set project_roots to the folder or folders containing your repos. Use forward slashes on Windows.

[projects]
project_roots = ["C:/Users/you/code"]

Verify:

.venv/bin/python -c "import asyncio; from projects_server import otama; print([t.name for t in asyncio.run(otama.list_tools())])"

Ten tool names means you are running.

Connect it

Cursor — ~/.cursor/mcp.json. Claude Desktop — claude_desktop_config.json (Settings → Developer → Edit Config). Same shape either way:

{
  "mcpServers": {
    "otama-projects": {
      "command": "/absolute/path/to/otama/.venv/bin/python",
      "args": ["/absolute/path/to/otama/projects_server.py"]
    }
  }
}

On Windows use \\ in JSON paths — C:\\Users\\you\\otama\\.venv\\Scripts\\python.exe.

Restart the app fully. A reload is not enough; MCP servers load at startup.

Tools

Read — run immediately

Tool Returns
list_projects Every repo or folder under your roots, with a is_git_repo flag
project_tree Two-level tree, skipping node_modules, .venv, dist and friends
read_file One text file, size-capped
search_code Regex across a project, with file and line numbers
git_status Branch, uncommitted files, last five commits
git_diff Working-tree diff, truncated
daily_brief What moved across every repo in the last N days

Write and execute — confirmation required

Tool Does
git_commit Stage all and commit
write_file Create or overwrite a file
run_command Run an allowlisted development command

Configuration

[projects]
project_roots            = ["C:/Users/you/code"]
max_file_bytes           = 200000   # refuse to read anything larger
command_timeout_seconds  = 120
confirmation_ttl_seconds = 120      # how long a token stays valid

# run_command refuses anything not on this list. This is not something a
# confirmation can override — add what you actually use.
allowed_commands = ["git","npm","npx","pnpm","yarn","node",
                    "python","py","pip","pytest","ruff","uv",
                    "dotnet","cargo","go"]

Notes for contributors

The two-phase pattern lives in stage(), redeem() and _expire(). If you add a tool with side effects, use it.

One subtlety worth preserving: redeem() does not consume the token when the tool kind does not match. A model calling the wrong tool by mistake must not burn the user's approval and force them to confirm all over again. This was a real bug, caught in testing.

New capability servers should follow the same shape — one file, one domain, read tools free, write tools gated, refuse rather than confirm when the action is outside the envelope.

Status

Early. The projects server is tested and in daily use; more capability servers (media, mail, browser) are planned as part of a larger voice-assistant project. Issues and PRs welcome.

License

MIT

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选