项目简介

'ibmi-mcp-server' 是一个专为IBM i系统设计的MCP服务器实现,旨在将IBM i的数据和功能以标准化的方式暴露给大型语言模型 (LLM) 客户端。它允许LLM应用通过JSON-RPC协议访问IBM i上的DB2数据库,执行SQL工具,并管理会话。服务器支持多种传输模式(如HTTP和Stdio),并提供认证机制,确保安全和可扩展的上下文服务。

主要功能点

  • SQL 工具托管: 能够托管并执行针对IBM i DB2数据库的SQL查询工具,实现数据访问和操作。
  • 资源管理: 统一管理IBM i上的各种资源,供LLM客户端查询和使用。
  • LLM 交互支持: 通过标准化的JSON-RPC协议与LLM客户端通信,支持会话管理和能力声明。
  • 多种传输协议: 支持HTTP和Stdio两种传输模式,方便不同类型的客户端集成。
  • IBM i 认证: 提供基于IBM i凭据的HTTP认证机制,支持会话令牌生成和管理,实现安全的用户级访问。
  • 灵活配置: 可通过环境变量或'.env'文件轻松配置数据库连接、认证模式、端口等。
  • 容器化部署: 提供Docker和Podman部署配置,便于集成到现代化微服务架构中。

安装步骤

  1. 克隆仓库并安装依赖:
    git clone https://github.com/IBM/ibmi-mcp-server.git
    cd ibmi-mcp-server/
    npm install
  2. 构建项目:
    npm run build
  3. 创建服务器配置文件'.env',并填写IBM i连接信息: 复制示例配置文件:
    cp .env.example .env
    然后编辑 '.env' 文件,填入你的 IBM i DB2 连接详情:
    # IBM i DB2 for i Connection Settings
    # Required for YAML SQL tools to connect to IBM i systems
    DB2i_HOST=你的IBM_i_主机名
    DB2i_USER=你的IBM_i_用户名
    DB2i_PASS=你的IBM_i_密码
    DB2i_PORT=8076
    DB2i_IGNORE_UNAUTHORIZED=true
  4. (可选)若要启用IBM i HTTP认证,需要生成RSA密钥对并配置'.env'文件: 首先生成密钥对:
    mkdir -p secrets
    openssl genpkey -algorithm RSA -out secrets/private.pem -pkeyopt rsa_keygen_bits:2048
    openssl rsa -pubout -in secrets/private.pem -out secrets/public.pem
    在 '.env' 文件中添加或修改以下配置:
    # Enable IBM i authentication system
    IBMI_HTTP_AUTH_ENABLED=true
    MCP_AUTH_MODE=ibmi
    
    # IBM i authentication settings
    IBMI_AUTH_KEY_ID=development
    IBMI_AUTH_PRIVATE_KEY_PATH=secrets/private.pem
    IBMI_AUTH_PUBLIC_KEY_PATH=secrets/public.pem
    
    # Security settings
    IBMI_AUTH_ALLOW_HTTP=true # 开发环境使用,生产环境请设为 false
    IBMI_AUTH_TOKEN_EXPIRY_SECONDS=3600 # Token lifetime (1 hour)

服务器配置示例 (MCP客户端所需)

MCP客户端需要配置MCP服务器的连接信息。以下是常见的配置参数及其说明,具体JSON格式取决于你使用的MCP客户端,请勿直接复制以下代码:

  • 服务器名称 ('name'): 客户端用于标识此MCP服务器的唯一名称,例如 '"ibmi-mcp"'。
  • 命令 ('command'): 如果客户端以本地进程方式启动MCP服务器,这是服务器可执行文件的路径和名称,例如 '"npx"' 或 '"node"'。
  • 参数 ('args'): 启动服务器时传递给命令的命令行参数列表,例如 '["ibmi-mcp-server", "--tools", "/absolute/path/to/your/tools"]'。
    • '/absolute/path/to/your/tools': 替换为您的SQL工具配置目录的绝对路径。
  • URL ('url'): 如果客户端通过HTTP/HTTPS连接远程MCP服务器,这是服务器的端点URL,例如 '"http://localhost:3010/mcp"'。
  • 类型/传输协议 ('type' / 'transport'): 客户端与服务器通信所使用的传输协议类型,例如 '"http"'(HTTP流传输)或 '"stdio"'(标准输入/输出)。
  • 请求头 ('headers'): 用于HTTP认证的请求头,特别是在启用了IBM i HTTP认证时,例如 '{"Authorization": "Bearer YOUR_ACCESS_TOKEN_HERE"}'。
  • 环境变量 ('env'): MCP服务器进程所需的环境变量列表,例如 '{"DB2i_HOST": "your-ibmi-host.com", "DB2i_USER": "your-username", "DB2i_PASS": "your-password", "DB2i_PORT": "8076", "MCP_TRANSPORT_TYPE": "stdio"}'。

基本使用方法

  1. 启动服务器:

    • 通过HTTP模式启动(推荐开发使用,方便远程客户端连接):
      npx ibmi-mcp-server --transport http --tools ./tools
    • 通过Stdio模式启动(适用于CLI工具或MCP Inspector等本地客户端):
      npx ibmi-mcp-server --transport stdio --tools /absolute/path/to/tools
      请确保 '/absolute/path/to/tools' 是您的 'tools' 目录的绝对路径。
  2. 获取访问令牌(如果启用了IBM i HTTP认证): 在服务器启动后,可以使用提供的脚本获取访问令牌:

    node get-access-token.js --verbose
    # 成功后,你将获得一个IBMI_MCP_ACCESS_TOKEN环境变量,可用于客户端请求的Authorization头。
  3. 在MCP客户端中连接和使用: 根据你使用的MCP客户端(如Claude Code, VSCode Copilot Chat, Gemini CLI等),按照其文档进行配置。通常你需要提供服务器的URL(HTTP模式)或启动命令(Stdio模式),并包含认证令牌(如果需要)。

    示例:使用Python客户端连接并列出工具

    import asyncio
    import os
    from mcp.client.streamable_http import streamablehttp_client
    from mcp import ClientSession
    
    async def main():
        token = os.environ.get('IBMI_MCP_ACCESS_TOKEN') # 从环境变量获取令牌
        headers = {"Authorization": f"Bearer {token}"} if token else {}
        
        # 连接到MCP服务器
        async with streamablehttp_client("http://localhost:3010/mcp", headers=headers) as (read_stream, write_stream, _):
            async with ClientSession(read_stream, write_stream) as session:
                await session.initialize() # 初始化会话
                tools = await session.list_tools() # 列出服务器上注册的所有工具
                print(f"可用工具: {[t.name for t in tools.tools]}")
                
                # (可选)调用一个工具
                # result = await session.call_tool("system_status", {})
                # print(f"系统状态: {result}")
    
    if __name__ == "__main__":
        asyncio.run(main())

信息

分类

商业系统