Python SDK for gopher-mcp-python, providing AI agent orchestration with native C++ performance through ctypes FFI bindings.
- Python 3.8+ compatibility
- pip/setuptools build system
- ctypes FFI bindings to native library
- GopherAgent class with builder pattern configuration
- Context manager support for automatic resource cleanup
- Typed errors (AgentError, ApiKeyError, ConnectionError, TimeoutError)
- Comprehensive test suite with pytest
- Python 3.8 or higher
- Native gopher-mcp-python library (built from source)
- Clone the repository:
git clone https://github.com/GopherSecurity/gopher-mcp-python.git
cd gopher-mcp-python- Build the native library:
./build.sh- Install the Python package:
pip install -e .from gopher_mcp_python import GopherAgent, GopherAgentConfig
# Create configuration with API key
config = (GopherAgentConfig.builder()
.provider("AnthropicProvider")
.model("claude-3-haiku-20240307")
.api_key("your-api-key")
.build())
# Create and use agent with context manager
with GopherAgent.create(config) as agent:
response = agent.run("What time is it in Tokyo?")
print(response)from gopher_mcp_python import GopherAgent, GopherAgentConfig
# Create configuration with server config
config = (GopherAgentConfig.builder()
.provider("AnthropicProvider")
.model("claude-3-haiku-20240307")
.server_config('{"mcpServers": [...]}')
.build())
# Create agent
agent = GopherAgent.create(config)
try:
response = agent.run("What is the weather?")
print(response)
finally:
agent.dispose()from gopher_mcp_python import GopherAgent
# Create with API key (shorthand)
agent = GopherAgent.create_with_api_key(
provider="AnthropicProvider",
model="claude-3-haiku-20240307",
api_key="your-api-key"
)
# Or with server config
agent = GopherAgent.create_with_server_config(
provider="AnthropicProvider",
model="claude-3-haiku-20240307",
server_config='{"mcpServers": [...]}'
)from gopher_mcp_python import GopherAgent
with GopherAgent.create(config) as agent:
result = agent.run_detailed("What time is it?")
if result.is_success():
print(f"Response: {result.response}")
print(f"Iterations: {result.iteration_count}")
print(f"Tokens used: {result.tokens_used}")
elif result.is_timeout():
print(f"Request timed out: {result.error_message}")
else:
print(f"Error: {result.error_message}")Main class for interacting with the gopher-mcp-python native library.
GopherAgent.init()- Initialize the library (called automatically)GopherAgent.shutdown()- Shutdown the libraryGopherAgent.is_initialized()- Check if library is initializedGopherAgent.create(config)- Create an agent with configurationGopherAgent.create_with_api_key(provider, model, api_key)- Convenience methodGopherAgent.create_with_server_config(provider, model, server_config)- Convenience method
agent.run(query, timeout_ms=60000)- Run a query and get response stringagent.run_detailed(query, timeout_ms=60000)- Run a query and get AgentResultagent.dispose()- Release resourcesagent.is_disposed()- Check if agent is disposed
Configuration class with builder pattern.
config = (GopherAgentConfig.builder()
.provider("AnthropicProvider") # Required
.model("claude-3-haiku-20240307") # Required
.api_key("key") # Either api_key or server_config required
.server_config("{...}") # Either api_key or server_config required
.build())Result class with status and metadata.
result.response- Response textresult.status- AgentResultStatus enumresult.iteration_count- Number of iterationsresult.tokens_used- Tokens consumedresult.error_message- Error message (if applicable)result.is_success()- Check if successfulresult.is_error()- Check if errorresult.is_timeout()- Check if timeout
AgentError- Base exception for agent errorsApiKeyError- Invalid API keyConnectionError- Connection failedTimeoutError- Operation timed out
pytestThis project uses Black for code formatting and Ruff for linting.
Format code:
black .Check formatting without modifying:
black --check .Run linter:
ruff check .Fix linting issues:
ruff check --fix ../build.sh./build.sh --cleanGOPHER_MCP_PYTHON_LIBRARY_PATH- Custom path to native libraryDEBUG- Enable debug output for library loading
See LICENSE file for details.