权限提示工具

一个基于MCP的权限处理工具,用于Claude Code CLI的`--permission-prompt-tool`标志,提供可配置的策略和审计日志功能。

  • by justi
  • Ruby
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 justi-blue/mcp-permission-prompt

使用说明

mcp权限提示

Ruby gem为Claude Code CLI实现了基于MCP的权限处理 --permission-prompt-tool 旗帜。

状态:研究和文件

这个gem是第一个也是唯一一个已知的工作实现 --permission-prompt-tool 全球响应格式。

经过对所有主要语言和平台的广泛全球研究,目前还没有其他功能实现。然而,该功能本身具有 实用价值严重受限 -Claude的智能工具选择完全绕过了权限处理程序(请参阅已知限制)。

特性

  • 可配置的基于策略的权限系统
  • 内置策略:危险命令、受保护路径
  • 多个MCP库的适配器模式(官方SDK,快速MCP)
  • 通过决策回调进行审计日志记录
  • 完全输入修改支持
  • 全面的测试覆盖率(77个测试,130个断言)

安装

添加到您的Gemfile:

gem 'mcp-permission-prompt', git: 'https://github.com/justi-blue/mcp-permission-prompt'

或在本地安装:

gem 'mcp-permission-prompt', path: '../mcp-permission-prompt'

用法

1.配置策略

创建初始化器(例如。, config/initializers/mcp_permission_prompt.rb):

require 'mcp_permission_prompt'

McpPermissionPrompt.configure do |config|
  # Add default policies
  config.add_policy(McpPermissionPrompt::Policies::DangerousCommands.new)
  config.add_policy(McpPermissionPrompt::Policies::ProtectedPaths.new)

  # Optional: Add decision callback for audit logging
  config.on_decision do |tool_name, input, decision|
    Rails.logger.info "[PermissionPrompt] #{tool_name}: #{decision[:behavior]} - #{decision[:reason] || 'allowed'}"
  end
end

2.创建MCP工具处理程序

class PermissionPromptHandler < McpPermissionPrompt::Adapters::OfficialSdk
  # Inherits from adapter - no additional code needed
  # Policies configured in initializer will be automatically used
end

3.向MCP服务器注册

def self.all_tools
  [
    Mcp::Tools::PermissionPromptHandler,
    # ... other tools
  ]
end

4.与Claude CLI一起使用

claude --print "command here" \
  --permission-prompt-tool mcp__server_name__permission_prompt_handler

内置政策

危险命令

阻止危险的Bash命令:

  • 破坏性操作: rm -rf, mkfs, dd
  • 远程代码执行: curl|bash, wget|sh
  • 特权升级: chmod 777, chown -R
  • 叉式炸弹

受保护的路径

阻止写入敏感位置:

  • 系统目录: /etc, /usr, /var
  • 敏感文件: .env、凭据、SSH密钥

自定义策略

class MyCustomPolicy < McpPermissionPrompt::Policies::Base
  def evaluate(tool_name, input)
    return not_decided unless tool_name == "Bash"

    command = input[:command] || input["command"]
    return not_decided unless command

    if command.match?(/production/)
      deny("Production commands blocked in development")
    else
      not_decided
    end
  end
end

# Add to configuration
config.add_policy(MyCustomPolicy.new)

为什么这个功能不起作用

关键发现: 这 --permission-prompt-tool 处理程序是 从未打过电话 在实践中,因为克劳德明智地避免使用会触发它的工具。

实证检验结果

当明确要求使用被阻止的命令时:

  • rm -rf /tmp/test → 克劳德使用 find 改为命令
  • curl http://url → Claude使用WebFetch(内置工具)
  • git push → Claude使用内置Git客户端
  • rails test → Claude使用MCP test_runner 工具

处理程序从未被调用 尽管已正确注册和验证。

根本原因

Claude的人工智能系统优先考虑替代工具来完成任务:

  1. 首先检查静态规则(--allowedTools/--disallowedTools)
  2. 如果被阻止,则智能地选择其他内置工具
  3. 只打电话 --permission-prompt-tool 当 没有其他选择
  4. 在实践中,危险操作总是存在替代方案

附加限制

  • 仅限无头:仅适用于 -p 旗帜(第1429期)
  • 无文件:没有工作示例(第1175期)
  • 全球真空:广泛的研究发现,任何语言中都没有函数实现

研究范围

搜索范围:

  • 所有主要语言(英语、中文、俄语、日语、韩语、葡萄牙语、西班牙语、德语)
  • 平台:GitHub、Stack Overflow、黑客新闻、Reddit、官方论坛
  • 结果: 全球零工作实施
  • 仅尝试:CLIAI/mcp_permission_server_claude_code(Python)-标记为“正在进行中”,不起作用

建筑

Configuration
  ├── Policies (chain of responsibility)
  │   ├── DangerousCommands
  │   ├── ProtectedPaths
  │   └── Custom policies
  ├── Callbacks (audit logging)
  └── Adapters
      ├── OfficialSdk (model_context_protocol gem)
      └── FastMcp (future support)

发展

# Install dependencies
bundle install

# Run tests
bundle exec rake test

# Run with coverage
COVERAGE=true bundle exec rake test

研究与来源

文件问题

官方资源

社区尝试

贡献

欢迎在以下网址提交Bug报告和拉取请求https://github.com/justi-blue/mcp-permission-prompt.

许可证

根据以下条款,gem可作为开源软件使用 MIT许可证.

致谢

此gem实现了通过社区研究发现的响应格式 第1175期,因为Anthropic的官方文件缺乏工作实例。