Skip to main content

Matimo core — framework-agnostic SDK: pre-built providers, skills layer, MCP, and a policy engine you control

Project description

matimo-core

Configuration-driven AI tools SDK — core module.

PyPI Python Docs Tests Coverage

Write tools once in YAML, use them everywhere — with LangChain, CrewAI, MCP, and more.

Note: Most users should install matimo (the convenience wrapper) instead of matimo-core directly.


Installation

pip install matimo-core
# with framework extras
pip install "matimo-core[langchain]"
pip install "matimo-core[crewai]"
pip install "matimo-core[mcp]"
pip install "matimo-core[langchain,crewai,mcp]"

Quick Start

Factory pattern

import asyncio
from matimo import Matimo

async def main():
    # Load tools from a directory
    matimo = await Matimo.init('./tools')
    result = await matimo.execute('my_tool', {'param': 'value'})
    print(result)

asyncio.run(main())

Auto-discover installed providers

from matimo import Matimo

matimo = await Matimo.init(auto_discover=True)
tools = matimo.list_tools()
print(f"{len(tools)} tools loaded")

Decorator pattern

from matimo import Matimo, tool, set_global_matimo_instance

matimo = await Matimo.init('./tools')
set_global_matimo_instance(matimo)

class MyAgent:
    @tool('slack_send_channel_message')
    async def send_message(self, channel: str, text: str): ...
    # Decorator handles execution automatically

LangChain

from matimo import Matimo
from matimo.integrations.langchain import convert_tools_to_langchain
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate

matimo = await Matimo.init(auto_discover=True)
lc_tools = convert_tools_to_langchain(
    matimo.list_tools(),
    matimo,
    credentials={'SLACK_BOT_TOKEN': 'xoxb-...'},
)
llm = ChatOpenAI(model='gpt-4o-mini')
prompt = ChatPromptTemplate.from_messages([
    ('system', 'You are a helpful assistant.'),
    ('human', '{input}'),
    ('placeholder', '{agent_scratchpad}'),
])
agent = create_tool_calling_agent(llm, lc_tools, prompt)
executor = AgentExecutor(agent=agent, tools=lc_tools)
result = await executor.ainvoke({'input': 'List all Slack channels'})

CrewAI

from matimo import Matimo
from matimo.integrations.crewai import convert_tools_to_crewai

matimo = await Matimo.init(auto_discover=True)
tools = convert_tools_to_crewai(matimo.list_tools(), matimo)

MCP server

from matimo import Matimo, create_mcp_server, MCPServerOptions

matimo = await Matimo.init(auto_discover=True)
server = await create_mcp_server(matimo, MCPServerOptions(name='my-agent', version='1.0.0'))
await server.start()

Core API

Matimo.init()

from matimo import Matimo, InitOptions

matimo = await Matimo.init(
    tool_paths=['./tools', './agent-tools'],  # or a single string
    auto_discover=False,       # discover installed matimo-* packages
    include_core=True,         # include built-in meta-tools
    policy_file='./policy.yaml',
    untrusted_paths=['./agent-tools'],
    skill_paths=['./skills'],
    log_level='info',          # silent | error | warn | info | debug
    log_format='json',         # json | simple
    on_event=my_event_handler,
    on_hitl=my_approval_callback,
)

Key methods

Method Description
await matimo.execute(name, params) Execute a tool by name
matimo.list_tools() Return all loaded ToolDefinition objects
matimo.get_tool(name) Get a single ToolDefinition (or None)
matimo.search_tools(query) Text search over tool names + descriptions
await matimo.reload() Hot-reload tools from disk
matimo.list_skills() Return all loaded skill definitions
await matimo.semantic_search_skills(query) TF-IDF search over skills
matimo.has_policy() Whether a policy engine is active

Tool YAML Format

name: my_api_tool
version: '1.0.0'
description: Fetch data from an API
parameters:
  query:
    type: string
    required: true
    description: Search query
execution:
  type: http
  method: GET
  url: 'https://api.example.com/search?q={query}'
  headers:
    Authorization: 'Bearer {API_KEY}'

Policy Engine

from matimo import Matimo, InitOptions

matimo = await Matimo.init('./tools', InitOptions(
    policy_file='./policy.yaml',
    on_hitl=lambda req: {'approved': True, 'reason': 'auto'},
))

policy.yaml:

allowedDomains:
  - api.github.com
  - api.slack.com
allowedHttpMethods: [GET, POST]
allowCommandTools: false
allowFunctionTools: false

Secrets Management

from matimo.mcp.secrets import create_resolver_chain

resolver = create_resolver_chain([
    {'type': 'env'},
    {'type': 'dotenv', 'path': '.env'},
    {'type': 'vault', 'address': 'http://vault:8200'},
    {'type': 'aws', 'region': 'us-east-1'},
])
token = await resolver.resolve('SLACK_BOT_TOKEN')

Logging

from matimo import Matimo
from matimo.logging import get_global_matimo_logger

matimo = await Matimo.init('./tools', log_level='info', log_format='json')
logger = get_global_matimo_logger()
logger.info('Tool executed', {'tool': 'slack_send_channel_message'})

Meta-Tools (Agent Tool Lifecycle)

Built-in tools that let agents manage other tools at runtime:

Tool Purpose Requires Approval
matimo_validate_tool Validate YAML definition No
matimo_create_tool Write new tool to disk Yes
matimo_approve_tool Promote draft → approved Yes
matimo_reload_tools Hot-reload registry Yes
matimo_list_user_tools List agent-created tools No
matimo_get_tool_status Check approval state Yes
matimo_create_skill Create a SKILL.md Yes
matimo_list_skills List available skills No
matimo_get_skill Read skill content No
matimo_validate_skill Validate skill spec No

Documentation


Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

matimo_core-0.1.0a14.post1.tar.gz (77.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

matimo_core-0.1.0a14.post1-py3-none-any.whl (114.8 kB view details)

Uploaded Python 3

File details

Details for the file matimo_core-0.1.0a14.post1.tar.gz.

File metadata

  • Download URL: matimo_core-0.1.0a14.post1.tar.gz
  • Upload date:
  • Size: 77.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for matimo_core-0.1.0a14.post1.tar.gz
Algorithm Hash digest
SHA256 ac9ee8fca9ae2f4c1c972bc407c675de0daa902824f7c090bfd437ea1e36accd
MD5 148f33a9b3db186c21a109b24d9b0929
BLAKE2b-256 7899d5cc01854019dff099648b428c24ea80e4dbaf41c81687e814486c18a640

See more details on using hashes here.

File details

Details for the file matimo_core-0.1.0a14.post1-py3-none-any.whl.

File metadata

File hashes

Hashes for matimo_core-0.1.0a14.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 0072a069027695d877bf151c95acfaadd15da68a84f88685f4bfebf499624dc0
MD5 ea06880fdb5ba4c8941da905852c05f6
BLAKE2b-256 fe116b47548976b42176442f6fd34109ae9b55328ff6d3e904d7ba34958b1d31

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page