axiomatic-mcp 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- axiomatic_mcp-0.0.1/PKG-INFO +217 -0
- axiomatic_mcp-0.0.1/README.md +188 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/__init__.py +3 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/servers/__init__.py +9 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/servers/documents/__init__.py +5 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/servers/documents/__main__.py +4 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/servers/documents/server.py +46 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/servers/pic/__init__.py +5 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/servers/pic/__main__.py +4 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/servers/pic/server.py +48 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/shared/__init__.py +7 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp/shared/api_client.py +47 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp.egg-info/PKG-INFO +217 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp.egg-info/SOURCES.txt +18 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp.egg-info/dependency_links.txt +1 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp.egg-info/entry_points.txt +3 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp.egg-info/requires.txt +10 -0
- axiomatic_mcp-0.0.1/axiomatic_mcp.egg-info/top_level.txt +1 -0
- axiomatic_mcp-0.0.1/pyproject.toml +61 -0
- axiomatic_mcp-0.0.1/setup.cfg +4 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: axiomatic-mcp
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Modular MCP servers for Axiomatic_AI
|
|
5
|
+
Author-email: Axiomatic Team <developers@axiomatic.ai>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/axiomatic/ax-mcp
|
|
8
|
+
Project-URL: Issues, https://github.com/axiomatic/ax-mcp/issues
|
|
9
|
+
Keywords: mcp,axiomatic,ai,fastmcp
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
Requires-Dist: fastmcp>=0.1.0
|
|
21
|
+
Requires-Dist: pydantic>=2.0.0
|
|
22
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
23
|
+
Requires-Dist: httpx>=0.25.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
26
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
27
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
28
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
29
|
+
|
|
30
|
+
# Axiomatic MCP Server
|
|
31
|
+
|
|
32
|
+
MCP (Model Context Protocol) server for the Axiomatic_AI platform, built with FastMCP in Python. Provides access to Axiomatic_AI's tools via MCP.
|
|
33
|
+
|
|
34
|
+
- **FastMCP-based server**: Built on the FastMCP framework for efficient MCP implementation
|
|
35
|
+
- **Axiomatic API integration**: Connects to Axiomatic AI's API for various tooling
|
|
36
|
+
- **Simple configuration**: Easy setup with API key environment variable
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
> **Important**: Not yet released to PyPi. Follow the developer for instructions for now
|
|
41
|
+
|
|
42
|
+
You can install each domain server independently based on your needs. These can be installed in many MCP clients such as cursor or claude.
|
|
43
|
+
|
|
44
|
+
**For PIC Domain:**
|
|
45
|
+
|
|
46
|
+
[](https://cursor.com/en/install-mcp?name=axiomatic-pic&config=eyJjb21tYW5kIjoidXZ4IC0tZnJvbSBheGlvbWF0aWMtbWNwIGF4aW9tYXRpYy1waWMiLCJlbnYiOnsiQVhJT01BVElDX0FQSV9LRVkiOiJFTlRFUiBZT1VSIEFQSSBLRVkifX0%3D)
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"axiomatic-pic": {
|
|
51
|
+
"command": "uvx",
|
|
52
|
+
"args": ["--from", "axiomatic-mcp", "axiomatic-pic"],
|
|
53
|
+
"env": {
|
|
54
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**For Documents:**
|
|
61
|
+
|
|
62
|
+
[](https://cursor.com/en/install-mcp?name=axiomatic-documents&config=eyJjb21tYW5kIjoidXZ4IC0tZnJvbSBheGlvbWF0aWMtbWNwIGF4aW9tYXRpYy1kb2N1bWVudHMiLCJlbnYiOnsiQVhJT01BVElDX0FQSV9LRVkiOiJFTlRFUiBZT1VSIEFQSSBLRVkifX0%3D)
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"axiomatic-documents": {
|
|
67
|
+
"command": "uvx",
|
|
68
|
+
"args": ["--from", "axiomatic-mcp", "axiomatic-documents"],
|
|
69
|
+
"env": {
|
|
70
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Development
|
|
77
|
+
|
|
78
|
+
1. Clone the repository:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/axiomatic/ax-mcp.git
|
|
82
|
+
cd ax-mcp
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
2. Install in development mode:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
make install-dev
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
3. Add servers to Cursor using Python module paths:
|
|
92
|
+
|
|
93
|
+
**For PIC Domain:**
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"axiomatic-pic": {
|
|
98
|
+
"command": "python",
|
|
99
|
+
"args": ["-m", "axiomatic_mcp.servers.pic"],
|
|
100
|
+
"env": {
|
|
101
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**For Documents:**
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"axiomatic-documents": {
|
|
112
|
+
"command": "python",
|
|
113
|
+
"args": ["-m", "axiomatic_mcp.servers.documents"],
|
|
114
|
+
"env": {
|
|
115
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Project Structure
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
ax-mcp/
|
|
125
|
+
├── axiomatic_mcp/
|
|
126
|
+
│ ├── shared/ # Shared utilities
|
|
127
|
+
│ └── servers/ # Domain-specific servers
|
|
128
|
+
├── pyproject.toml # Python package configuration
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Adding a New Server
|
|
132
|
+
|
|
133
|
+
1. Create server directory:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
mkdir axiomatic_mcp/servers/my_domain
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
2. Create `__init__.py`:
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
from .server import MyDomainServer
|
|
143
|
+
|
|
144
|
+
def main():
|
|
145
|
+
server = MyDomainServer()
|
|
146
|
+
server.run()
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
2. Create `__main__.py`:
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
from . import main
|
|
153
|
+
|
|
154
|
+
if __name__ == "__main__":
|
|
155
|
+
main()
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
3. Implement server in `server.py`:
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
from fastmcp import FastMCP
|
|
162
|
+
|
|
163
|
+
mcp = FastMCP(
|
|
164
|
+
name="NAME",
|
|
165
|
+
instructions="""GIVE NICE INSTRUCTIONS""",
|
|
166
|
+
version="0.0.1",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
@mcp.tool(
|
|
170
|
+
name="tool_name",
|
|
171
|
+
description="DESCRIPTION",
|
|
172
|
+
tags=["TAG"],
|
|
173
|
+
)
|
|
174
|
+
def my_tool():
|
|
175
|
+
pass
|
|
176
|
+
|
|
177
|
+
# Add more tools as needed
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
4. Add entry point to `pyproject.toml`:
|
|
181
|
+
|
|
182
|
+
```toml
|
|
183
|
+
[project.scripts]
|
|
184
|
+
axiomatic-mydomain = "axiomatic_mcp.servers.my_domain:main"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
5. Update README.md with instructions on installing your server. You can generate the "Add to cursor" button [here](https://docs.cursor.com/en/tools/developers)
|
|
188
|
+
|
|
189
|
+
## Troubleshooting
|
|
190
|
+
|
|
191
|
+
### Server not appearing in Cursor
|
|
192
|
+
|
|
193
|
+
1. Restart Cursor after updating MCP settings
|
|
194
|
+
2. Check the Output panel (View → Output → MCP) for errors
|
|
195
|
+
3. Verify the command path is correct
|
|
196
|
+
|
|
197
|
+
### Multiple servers overwhelming the LLM
|
|
198
|
+
|
|
199
|
+
Install only the domain servers you need. Each server runs independently, so you can add/remove them as needed.
|
|
200
|
+
|
|
201
|
+
### API connection errors
|
|
202
|
+
|
|
203
|
+
1. Verify your API key is set correctly
|
|
204
|
+
2. Check internet connection
|
|
205
|
+
|
|
206
|
+
## Release Process
|
|
207
|
+
|
|
208
|
+
### Publishing a Release
|
|
209
|
+
|
|
210
|
+
1. Create a new release branch
|
|
211
|
+
1. Update version in `pyproject.toml`
|
|
212
|
+
1. Commit and push changes
|
|
213
|
+
1. Create a pull request titled "Release: YOUR FEATURE(s)". Include detailed description of what's included in the release.
|
|
214
|
+
1. Create a GitHub release with tag `vX.Y.Z`
|
|
215
|
+
1. GitHub Actions automatically publishes to PyPI
|
|
216
|
+
|
|
217
|
+
The package is available at: https://pypi.org/project/axiomatic-mcp/
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# Axiomatic MCP Server
|
|
2
|
+
|
|
3
|
+
MCP (Model Context Protocol) server for the Axiomatic_AI platform, built with FastMCP in Python. Provides access to Axiomatic_AI's tools via MCP.
|
|
4
|
+
|
|
5
|
+
- **FastMCP-based server**: Built on the FastMCP framework for efficient MCP implementation
|
|
6
|
+
- **Axiomatic API integration**: Connects to Axiomatic AI's API for various tooling
|
|
7
|
+
- **Simple configuration**: Easy setup with API key environment variable
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
> **Important**: Not yet released to PyPi. Follow the developer for instructions for now
|
|
12
|
+
|
|
13
|
+
You can install each domain server independently based on your needs. These can be installed in many MCP clients such as cursor or claude.
|
|
14
|
+
|
|
15
|
+
**For PIC Domain:**
|
|
16
|
+
|
|
17
|
+
[](https://cursor.com/en/install-mcp?name=axiomatic-pic&config=eyJjb21tYW5kIjoidXZ4IC0tZnJvbSBheGlvbWF0aWMtbWNwIGF4aW9tYXRpYy1waWMiLCJlbnYiOnsiQVhJT01BVElDX0FQSV9LRVkiOiJFTlRFUiBZT1VSIEFQSSBLRVkifX0%3D)
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"axiomatic-pic": {
|
|
22
|
+
"command": "uvx",
|
|
23
|
+
"args": ["--from", "axiomatic-mcp", "axiomatic-pic"],
|
|
24
|
+
"env": {
|
|
25
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**For Documents:**
|
|
32
|
+
|
|
33
|
+
[](https://cursor.com/en/install-mcp?name=axiomatic-documents&config=eyJjb21tYW5kIjoidXZ4IC0tZnJvbSBheGlvbWF0aWMtbWNwIGF4aW9tYXRpYy1kb2N1bWVudHMiLCJlbnYiOnsiQVhJT01BVElDX0FQSV9LRVkiOiJFTlRFUiBZT1VSIEFQSSBLRVkifX0%3D)
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"axiomatic-documents": {
|
|
38
|
+
"command": "uvx",
|
|
39
|
+
"args": ["--from", "axiomatic-mcp", "axiomatic-documents"],
|
|
40
|
+
"env": {
|
|
41
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Development
|
|
48
|
+
|
|
49
|
+
1. Clone the repository:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
git clone https://github.com/axiomatic/ax-mcp.git
|
|
53
|
+
cd ax-mcp
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
2. Install in development mode:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
make install-dev
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
3. Add servers to Cursor using Python module paths:
|
|
63
|
+
|
|
64
|
+
**For PIC Domain:**
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"axiomatic-pic": {
|
|
69
|
+
"command": "python",
|
|
70
|
+
"args": ["-m", "axiomatic_mcp.servers.pic"],
|
|
71
|
+
"env": {
|
|
72
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**For Documents:**
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"axiomatic-documents": {
|
|
83
|
+
"command": "python",
|
|
84
|
+
"args": ["-m", "axiomatic_mcp.servers.documents"],
|
|
85
|
+
"env": {
|
|
86
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Project Structure
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
ax-mcp/
|
|
96
|
+
├── axiomatic_mcp/
|
|
97
|
+
│ ├── shared/ # Shared utilities
|
|
98
|
+
│ └── servers/ # Domain-specific servers
|
|
99
|
+
├── pyproject.toml # Python package configuration
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Adding a New Server
|
|
103
|
+
|
|
104
|
+
1. Create server directory:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
mkdir axiomatic_mcp/servers/my_domain
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
2. Create `__init__.py`:
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
from .server import MyDomainServer
|
|
114
|
+
|
|
115
|
+
def main():
|
|
116
|
+
server = MyDomainServer()
|
|
117
|
+
server.run()
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
2. Create `__main__.py`:
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
from . import main
|
|
124
|
+
|
|
125
|
+
if __name__ == "__main__":
|
|
126
|
+
main()
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
3. Implement server in `server.py`:
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
from fastmcp import FastMCP
|
|
133
|
+
|
|
134
|
+
mcp = FastMCP(
|
|
135
|
+
name="NAME",
|
|
136
|
+
instructions="""GIVE NICE INSTRUCTIONS""",
|
|
137
|
+
version="0.0.1",
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
@mcp.tool(
|
|
141
|
+
name="tool_name",
|
|
142
|
+
description="DESCRIPTION",
|
|
143
|
+
tags=["TAG"],
|
|
144
|
+
)
|
|
145
|
+
def my_tool():
|
|
146
|
+
pass
|
|
147
|
+
|
|
148
|
+
# Add more tools as needed
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
4. Add entry point to `pyproject.toml`:
|
|
152
|
+
|
|
153
|
+
```toml
|
|
154
|
+
[project.scripts]
|
|
155
|
+
axiomatic-mydomain = "axiomatic_mcp.servers.my_domain:main"
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
5. Update README.md with instructions on installing your server. You can generate the "Add to cursor" button [here](https://docs.cursor.com/en/tools/developers)
|
|
159
|
+
|
|
160
|
+
## Troubleshooting
|
|
161
|
+
|
|
162
|
+
### Server not appearing in Cursor
|
|
163
|
+
|
|
164
|
+
1. Restart Cursor after updating MCP settings
|
|
165
|
+
2. Check the Output panel (View → Output → MCP) for errors
|
|
166
|
+
3. Verify the command path is correct
|
|
167
|
+
|
|
168
|
+
### Multiple servers overwhelming the LLM
|
|
169
|
+
|
|
170
|
+
Install only the domain servers you need. Each server runs independently, so you can add/remove them as needed.
|
|
171
|
+
|
|
172
|
+
### API connection errors
|
|
173
|
+
|
|
174
|
+
1. Verify your API key is set correctly
|
|
175
|
+
2. Check internet connection
|
|
176
|
+
|
|
177
|
+
## Release Process
|
|
178
|
+
|
|
179
|
+
### Publishing a Release
|
|
180
|
+
|
|
181
|
+
1. Create a new release branch
|
|
182
|
+
1. Update version in `pyproject.toml`
|
|
183
|
+
1. Commit and push changes
|
|
184
|
+
1. Create a pull request titled "Release: YOUR FEATURE(s)". Include detailed description of what's included in the release.
|
|
185
|
+
1. Create a GitHub release with tag `vX.Y.Z`
|
|
186
|
+
1. GitHub Actions automatically publishes to PyPI
|
|
187
|
+
|
|
188
|
+
The package is available at: https://pypi.org/project/axiomatic-mcp/
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""Documents MCP server for filesystem document operations."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Annotated
|
|
5
|
+
|
|
6
|
+
from fastmcp import FastMCP
|
|
7
|
+
from fastmcp.tools.tool import ToolResult
|
|
8
|
+
from mcp.types import TextContent
|
|
9
|
+
|
|
10
|
+
from ...shared import AxiomaticAPIClient
|
|
11
|
+
|
|
12
|
+
mcp = FastMCP(
|
|
13
|
+
name="Axiomatic Documents Server",
|
|
14
|
+
instructions="""This server provides tools to read, analyze, and process documents
|
|
15
|
+
from the filesystem using the Axiomatic_AI Platform.""",
|
|
16
|
+
version="0.0.1",
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@mcp.tool(
|
|
21
|
+
name="document_to_markdown",
|
|
22
|
+
description="Convert a PDF document to markdown using Axiomatic's advanced OCR.",
|
|
23
|
+
tags=["document", "filesystem", "analyze"],
|
|
24
|
+
)
|
|
25
|
+
async def document_to_markdown(
|
|
26
|
+
file_path: Annotated[Path, "The absolute path to the PDF file to analyze"],
|
|
27
|
+
) -> ToolResult:
|
|
28
|
+
if not file_path.exists():
|
|
29
|
+
raise FileNotFoundError(f"Document not found: {file_path}")
|
|
30
|
+
|
|
31
|
+
if file_path.suffix.lower() != ".pdf":
|
|
32
|
+
raise ValueError("File must be a PDF")
|
|
33
|
+
|
|
34
|
+
file_content = file_path.read_bytes()
|
|
35
|
+
files = {"file": (file_path.name, file_content, "application/pdf")}
|
|
36
|
+
data = {"method": "mistral", "ocr": False, "layout_model": "doclayout_yolo"}
|
|
37
|
+
|
|
38
|
+
response = AxiomaticAPIClient().post("/document/parse", files=files, data=data)
|
|
39
|
+
markdown: str = response["markdown"]
|
|
40
|
+
name = file_path.stem + ".md"
|
|
41
|
+
return ToolResult(
|
|
42
|
+
content=[TextContent(type="text", text=f"Generated markdown for: {name}\n\n```markdown\n{markdown}\n```")],
|
|
43
|
+
structured_content={
|
|
44
|
+
"suggestions": [{"type": "create_file", "path": name, "content": markdown, "description": f"Create {name} with the generated markdown"}]
|
|
45
|
+
},
|
|
46
|
+
)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""PIC (Photonic Integrated Circuit) domain MCP server."""
|
|
2
|
+
|
|
3
|
+
from typing import Annotated
|
|
4
|
+
|
|
5
|
+
from fastmcp import FastMCP
|
|
6
|
+
from fastmcp.tools.tool import ToolResult
|
|
7
|
+
from mcp.types import TextContent
|
|
8
|
+
|
|
9
|
+
from ...shared import AxiomaticAPIClient
|
|
10
|
+
|
|
11
|
+
mcp = FastMCP(
|
|
12
|
+
name="Axiomatic PIC Designer",
|
|
13
|
+
instructions="""This server provides tools to design, optimize,
|
|
14
|
+
and simulate photonic integrated circuits.""",
|
|
15
|
+
version="0.0.1",
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@mcp.tool(
|
|
20
|
+
name="design_circuit",
|
|
21
|
+
description="Design a photonic integrated circuit and optionally create a Python file",
|
|
22
|
+
tags=["design", "gfsfactory"],
|
|
23
|
+
)
|
|
24
|
+
async def design(
|
|
25
|
+
query: Annotated[str, "The query to design the circuit"],
|
|
26
|
+
existing_code: Annotated[str | None, "Existing code to use as a reference to refine"] = None,
|
|
27
|
+
) -> ToolResult:
|
|
28
|
+
"""Design a photonic integrated circuit."""
|
|
29
|
+
data = {
|
|
30
|
+
"query": query,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if existing_code:
|
|
34
|
+
data["code"] = existing_code
|
|
35
|
+
|
|
36
|
+
response = AxiomaticAPIClient().post("/pic/circuit/refine", data=data)
|
|
37
|
+
code: str = response["code"]
|
|
38
|
+
|
|
39
|
+
file_name = "circuit.py"
|
|
40
|
+
|
|
41
|
+
return ToolResult(
|
|
42
|
+
content=[TextContent(type="text", text=f"Generated photonic circuit design for: {file_name}\n\n```python\n{code}\n```")],
|
|
43
|
+
structured_content={
|
|
44
|
+
"suggestions": [
|
|
45
|
+
{"type": "create_file", "path": file_name, "content": code, "description": f"Create {file_name} with the generated circuit design"}
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
)
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
API_URL = "https://api.axiomatic-ai.com"
|
|
7
|
+
TIMEOUT = 1000
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class AxiomaticAPIClient:
|
|
11
|
+
def __init__(self):
|
|
12
|
+
api_key = os.getenv("AXIOMATIC_API_KEY")
|
|
13
|
+
if not api_key:
|
|
14
|
+
raise ValueError("AXIOMATIC_API_KEY environment variable is not set")
|
|
15
|
+
|
|
16
|
+
self.client = httpx.Client(
|
|
17
|
+
base_url=API_URL,
|
|
18
|
+
timeout=TIMEOUT,
|
|
19
|
+
headers={
|
|
20
|
+
"X-API-Key": api_key,
|
|
21
|
+
},
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
def get(
|
|
25
|
+
self,
|
|
26
|
+
endpoint: str,
|
|
27
|
+
params: dict[str, Any] | None = None,
|
|
28
|
+
) -> dict[str, Any]:
|
|
29
|
+
response = self.client.get(endpoint, params=params)
|
|
30
|
+
response.raise_for_status()
|
|
31
|
+
return response.json()
|
|
32
|
+
|
|
33
|
+
def post(
|
|
34
|
+
self,
|
|
35
|
+
endpoint: str,
|
|
36
|
+
data: dict[str, Any] | None = None,
|
|
37
|
+
files: dict[str, Any] | None = None,
|
|
38
|
+
) -> dict[str, Any]:
|
|
39
|
+
response = self.client.post(endpoint, files=files, data=data) if files else self.client.post(endpoint, json=data)
|
|
40
|
+
response.raise_for_status()
|
|
41
|
+
return response.json()
|
|
42
|
+
|
|
43
|
+
def __enter__(self):
|
|
44
|
+
return self
|
|
45
|
+
|
|
46
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
47
|
+
self.client.close()
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: axiomatic-mcp
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Modular MCP servers for Axiomatic_AI
|
|
5
|
+
Author-email: Axiomatic Team <developers@axiomatic.ai>
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/axiomatic/ax-mcp
|
|
8
|
+
Project-URL: Issues, https://github.com/axiomatic/ax-mcp/issues
|
|
9
|
+
Keywords: mcp,axiomatic,ai,fastmcp
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
18
|
+
Requires-Python: >=3.10
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
Requires-Dist: fastmcp>=0.1.0
|
|
21
|
+
Requires-Dist: pydantic>=2.0.0
|
|
22
|
+
Requires-Dist: python-dotenv>=1.0.0
|
|
23
|
+
Requires-Dist: httpx>=0.25.0
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
26
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
|
27
|
+
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
28
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
|
29
|
+
|
|
30
|
+
# Axiomatic MCP Server
|
|
31
|
+
|
|
32
|
+
MCP (Model Context Protocol) server for the Axiomatic_AI platform, built with FastMCP in Python. Provides access to Axiomatic_AI's tools via MCP.
|
|
33
|
+
|
|
34
|
+
- **FastMCP-based server**: Built on the FastMCP framework for efficient MCP implementation
|
|
35
|
+
- **Axiomatic API integration**: Connects to Axiomatic AI's API for various tooling
|
|
36
|
+
- **Simple configuration**: Easy setup with API key environment variable
|
|
37
|
+
|
|
38
|
+
## Installation
|
|
39
|
+
|
|
40
|
+
> **Important**: Not yet released to PyPi. Follow the developer for instructions for now
|
|
41
|
+
|
|
42
|
+
You can install each domain server independently based on your needs. These can be installed in many MCP clients such as cursor or claude.
|
|
43
|
+
|
|
44
|
+
**For PIC Domain:**
|
|
45
|
+
|
|
46
|
+
[](https://cursor.com/en/install-mcp?name=axiomatic-pic&config=eyJjb21tYW5kIjoidXZ4IC0tZnJvbSBheGlvbWF0aWMtbWNwIGF4aW9tYXRpYy1waWMiLCJlbnYiOnsiQVhJT01BVElDX0FQSV9LRVkiOiJFTlRFUiBZT1VSIEFQSSBLRVkifX0%3D)
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"axiomatic-pic": {
|
|
51
|
+
"command": "uvx",
|
|
52
|
+
"args": ["--from", "axiomatic-mcp", "axiomatic-pic"],
|
|
53
|
+
"env": {
|
|
54
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**For Documents:**
|
|
61
|
+
|
|
62
|
+
[](https://cursor.com/en/install-mcp?name=axiomatic-documents&config=eyJjb21tYW5kIjoidXZ4IC0tZnJvbSBheGlvbWF0aWMtbWNwIGF4aW9tYXRpYy1kb2N1bWVudHMiLCJlbnYiOnsiQVhJT01BVElDX0FQSV9LRVkiOiJFTlRFUiBZT1VSIEFQSSBLRVkifX0%3D)
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"axiomatic-documents": {
|
|
67
|
+
"command": "uvx",
|
|
68
|
+
"args": ["--from", "axiomatic-mcp", "axiomatic-documents"],
|
|
69
|
+
"env": {
|
|
70
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Development
|
|
77
|
+
|
|
78
|
+
1. Clone the repository:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git clone https://github.com/axiomatic/ax-mcp.git
|
|
82
|
+
cd ax-mcp
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
2. Install in development mode:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
make install-dev
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
3. Add servers to Cursor using Python module paths:
|
|
92
|
+
|
|
93
|
+
**For PIC Domain:**
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"axiomatic-pic": {
|
|
98
|
+
"command": "python",
|
|
99
|
+
"args": ["-m", "axiomatic_mcp.servers.pic"],
|
|
100
|
+
"env": {
|
|
101
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**For Documents:**
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"axiomatic-documents": {
|
|
112
|
+
"command": "python",
|
|
113
|
+
"args": ["-m", "axiomatic_mcp.servers.documents"],
|
|
114
|
+
"env": {
|
|
115
|
+
"AXIOMATIC_API_KEY": "your-api-key-here"
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Project Structure
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
ax-mcp/
|
|
125
|
+
├── axiomatic_mcp/
|
|
126
|
+
│ ├── shared/ # Shared utilities
|
|
127
|
+
│ └── servers/ # Domain-specific servers
|
|
128
|
+
├── pyproject.toml # Python package configuration
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Adding a New Server
|
|
132
|
+
|
|
133
|
+
1. Create server directory:
|
|
134
|
+
|
|
135
|
+
```bash
|
|
136
|
+
mkdir axiomatic_mcp/servers/my_domain
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
2. Create `__init__.py`:
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
from .server import MyDomainServer
|
|
143
|
+
|
|
144
|
+
def main():
|
|
145
|
+
server = MyDomainServer()
|
|
146
|
+
server.run()
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
2. Create `__main__.py`:
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
from . import main
|
|
153
|
+
|
|
154
|
+
if __name__ == "__main__":
|
|
155
|
+
main()
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
3. Implement server in `server.py`:
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
from fastmcp import FastMCP
|
|
162
|
+
|
|
163
|
+
mcp = FastMCP(
|
|
164
|
+
name="NAME",
|
|
165
|
+
instructions="""GIVE NICE INSTRUCTIONS""",
|
|
166
|
+
version="0.0.1",
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
@mcp.tool(
|
|
170
|
+
name="tool_name",
|
|
171
|
+
description="DESCRIPTION",
|
|
172
|
+
tags=["TAG"],
|
|
173
|
+
)
|
|
174
|
+
def my_tool():
|
|
175
|
+
pass
|
|
176
|
+
|
|
177
|
+
# Add more tools as needed
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
4. Add entry point to `pyproject.toml`:
|
|
181
|
+
|
|
182
|
+
```toml
|
|
183
|
+
[project.scripts]
|
|
184
|
+
axiomatic-mydomain = "axiomatic_mcp.servers.my_domain:main"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
5. Update README.md with instructions on installing your server. You can generate the "Add to cursor" button [here](https://docs.cursor.com/en/tools/developers)
|
|
188
|
+
|
|
189
|
+
## Troubleshooting
|
|
190
|
+
|
|
191
|
+
### Server not appearing in Cursor
|
|
192
|
+
|
|
193
|
+
1. Restart Cursor after updating MCP settings
|
|
194
|
+
2. Check the Output panel (View → Output → MCP) for errors
|
|
195
|
+
3. Verify the command path is correct
|
|
196
|
+
|
|
197
|
+
### Multiple servers overwhelming the LLM
|
|
198
|
+
|
|
199
|
+
Install only the domain servers you need. Each server runs independently, so you can add/remove them as needed.
|
|
200
|
+
|
|
201
|
+
### API connection errors
|
|
202
|
+
|
|
203
|
+
1. Verify your API key is set correctly
|
|
204
|
+
2. Check internet connection
|
|
205
|
+
|
|
206
|
+
## Release Process
|
|
207
|
+
|
|
208
|
+
### Publishing a Release
|
|
209
|
+
|
|
210
|
+
1. Create a new release branch
|
|
211
|
+
1. Update version in `pyproject.toml`
|
|
212
|
+
1. Commit and push changes
|
|
213
|
+
1. Create a pull request titled "Release: YOUR FEATURE(s)". Include detailed description of what's included in the release.
|
|
214
|
+
1. Create a GitHub release with tag `vX.Y.Z`
|
|
215
|
+
1. GitHub Actions automatically publishes to PyPI
|
|
216
|
+
|
|
217
|
+
The package is available at: https://pypi.org/project/axiomatic-mcp/
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
axiomatic_mcp/__init__.py
|
|
4
|
+
axiomatic_mcp.egg-info/PKG-INFO
|
|
5
|
+
axiomatic_mcp.egg-info/SOURCES.txt
|
|
6
|
+
axiomatic_mcp.egg-info/dependency_links.txt
|
|
7
|
+
axiomatic_mcp.egg-info/entry_points.txt
|
|
8
|
+
axiomatic_mcp.egg-info/requires.txt
|
|
9
|
+
axiomatic_mcp.egg-info/top_level.txt
|
|
10
|
+
axiomatic_mcp/servers/__init__.py
|
|
11
|
+
axiomatic_mcp/servers/documents/__init__.py
|
|
12
|
+
axiomatic_mcp/servers/documents/__main__.py
|
|
13
|
+
axiomatic_mcp/servers/documents/server.py
|
|
14
|
+
axiomatic_mcp/servers/pic/__init__.py
|
|
15
|
+
axiomatic_mcp/servers/pic/__main__.py
|
|
16
|
+
axiomatic_mcp/servers/pic/server.py
|
|
17
|
+
axiomatic_mcp/shared/__init__.py
|
|
18
|
+
axiomatic_mcp/shared/api_client.py
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
axiomatic_mcp
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "axiomatic-mcp"
|
|
7
|
+
version = "0.0.1"
|
|
8
|
+
description = "Modular MCP servers for Axiomatic_AI"
|
|
9
|
+
authors = [{name = "Axiomatic Team", email = "developers@axiomatic.ai"}]
|
|
10
|
+
readme = "README.md"
|
|
11
|
+
license = {text = "MIT"}
|
|
12
|
+
requires-python = ">=3.10"
|
|
13
|
+
classifiers = [
|
|
14
|
+
"Development Status :: 4 - Beta",
|
|
15
|
+
"Intended Audience :: Developers",
|
|
16
|
+
"License :: OSI Approved :: MIT License",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.10",
|
|
19
|
+
"Programming Language :: Python :: 3.11",
|
|
20
|
+
"Programming Language :: Python :: 3.12",
|
|
21
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
22
|
+
]
|
|
23
|
+
keywords = ["mcp", "axiomatic", "ai", "fastmcp"]
|
|
24
|
+
urls = {Homepage = "https://github.com/axiomatic/ax-mcp", Issues = "https://github.com/axiomatic/ax-mcp/issues"}
|
|
25
|
+
dependencies = [
|
|
26
|
+
"fastmcp>=0.1.0",
|
|
27
|
+
"pydantic>=2.0.0",
|
|
28
|
+
"python-dotenv>=1.0.0",
|
|
29
|
+
"httpx>=0.25.0",
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
[project.optional-dependencies]
|
|
33
|
+
dev = [
|
|
34
|
+
"pytest>=7.0.0",
|
|
35
|
+
"black>=23.0.0",
|
|
36
|
+
"ruff>=0.1.0",
|
|
37
|
+
"mypy>=1.0.0",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[project.scripts]
|
|
41
|
+
axiomatic-pic = "axiomatic_mcp.servers.pic:main"
|
|
42
|
+
axiomatic-documents = "axiomatic_mcp.servers.documents:main"
|
|
43
|
+
|
|
44
|
+
[tool.setuptools.packages.find]
|
|
45
|
+
where = ["."]
|
|
46
|
+
include = ["axiomatic_mcp*"]
|
|
47
|
+
|
|
48
|
+
[tool.black]
|
|
49
|
+
line-length = 150
|
|
50
|
+
target-version = ["py310", "py311", "py312"]
|
|
51
|
+
|
|
52
|
+
[tool.ruff]
|
|
53
|
+
line-length = 150
|
|
54
|
+
target-version = "py310"
|
|
55
|
+
select = ["E", "F", "I", "N", "UP", "B", "C4", "PTH", "SIM", "RUF"]
|
|
56
|
+
|
|
57
|
+
[tool.mypy]
|
|
58
|
+
python_version = "3.10"
|
|
59
|
+
strict = true
|
|
60
|
+
warn_return_any = true
|
|
61
|
+
warn_unused_configs = true
|