teeshield 0.1.0__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.
- teeshield-0.1.0/.github/workflows/ci.yml +31 -0
- teeshield-0.1.0/.github/workflows/publish.yml +29 -0
- teeshield-0.1.0/.github/workflows/scan.yml +55 -0
- teeshield-0.1.0/.gitignore +32 -0
- teeshield-0.1.0/CURATION-REPORT.md +68 -0
- teeshield-0.1.0/LICENSE +21 -0
- teeshield-0.1.0/PKG-INFO +67 -0
- teeshield-0.1.0/README.md +39 -0
- teeshield-0.1.0/action.yml +65 -0
- teeshield-0.1.0/batch-rewrites/rewrite-fetch.json +7 -0
- teeshield-0.1.0/batch-rewrites/rewrite-git.json +62 -0
- teeshield-0.1.0/batch-rewrites/rewrite-memory.json +47 -0
- teeshield-0.1.0/batch-scan-results.json +970 -0
- teeshield-0.1.0/pyproject.toml +54 -0
- teeshield-0.1.0/rewrite-llm-filesystem.json +72 -0
- teeshield-0.1.0/rewrites-filesystem.json +72 -0
- teeshield-0.1.0/src/teeshield/__init__.py +3 -0
- teeshield-0.1.0/src/teeshield/cli.py +77 -0
- teeshield-0.1.0/src/teeshield/evaluator/__init__.py +0 -0
- teeshield-0.1.0/src/teeshield/evaluator/runner.py +234 -0
- teeshield-0.1.0/src/teeshield/hardener/__init__.py +0 -0
- teeshield-0.1.0/src/teeshield/hardener/runner.py +145 -0
- teeshield-0.1.0/src/teeshield/models.py +92 -0
- teeshield-0.1.0/src/teeshield/rewriter/__init__.py +0 -0
- teeshield-0.1.0/src/teeshield/rewriter/runner.py +383 -0
- teeshield-0.1.0/src/teeshield/scanner/__init__.py +0 -0
- teeshield-0.1.0/src/teeshield/scanner/architecture_check.py +77 -0
- teeshield-0.1.0/src/teeshield/scanner/description_quality.py +203 -0
- teeshield-0.1.0/src/teeshield/scanner/license_check.py +89 -0
- teeshield-0.1.0/src/teeshield/scanner/runner.py +162 -0
- teeshield-0.1.0/src/teeshield/scanner/security_scan.py +131 -0
- teeshield-0.1.0/src/teeshield/utils/__init__.py +0 -0
- teeshield-0.1.0/tests/__init__.py +0 -0
- teeshield-0.1.0/tests/test_scanner.py +115 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [master, main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [master, main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
python-version: ['3.11', '3.12', '3.13']
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
|
|
19
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
20
|
+
uses: actions/setup-python@v5
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: pip install -e ".[dev]"
|
|
26
|
+
|
|
27
|
+
- name: Run tests
|
|
28
|
+
run: pytest tests/ -v
|
|
29
|
+
|
|
30
|
+
- name: Verify CLI
|
|
31
|
+
run: teeshield --version
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
id-token: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
publish:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
environment: pypi
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Set up Python
|
|
18
|
+
uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: '3.12'
|
|
21
|
+
|
|
22
|
+
- name: Install build tools
|
|
23
|
+
run: pip install build
|
|
24
|
+
|
|
25
|
+
- name: Build package
|
|
26
|
+
run: python -m build
|
|
27
|
+
|
|
28
|
+
- name: Publish to PyPI
|
|
29
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
name: TeeShield Scan
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
inputs:
|
|
6
|
+
target:
|
|
7
|
+
description: 'MCP server path or GitHub URL to scan'
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
format:
|
|
11
|
+
description: 'Output format'
|
|
12
|
+
required: false
|
|
13
|
+
default: 'table'
|
|
14
|
+
type: choice
|
|
15
|
+
options:
|
|
16
|
+
- table
|
|
17
|
+
- json
|
|
18
|
+
|
|
19
|
+
# Can be called from other repos
|
|
20
|
+
workflow_call:
|
|
21
|
+
inputs:
|
|
22
|
+
target:
|
|
23
|
+
description: 'MCP server path to scan'
|
|
24
|
+
required: true
|
|
25
|
+
type: string
|
|
26
|
+
|
|
27
|
+
jobs:
|
|
28
|
+
scan:
|
|
29
|
+
runs-on: ubuntu-latest
|
|
30
|
+
steps:
|
|
31
|
+
- uses: actions/checkout@v4
|
|
32
|
+
|
|
33
|
+
- name: Set up Python
|
|
34
|
+
uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: '3.12'
|
|
37
|
+
|
|
38
|
+
- name: Install TeeShield
|
|
39
|
+
run: pip install -e .
|
|
40
|
+
|
|
41
|
+
- name: Run scan
|
|
42
|
+
run: |
|
|
43
|
+
teeshield scan "${{ inputs.target }}" --format "${{ inputs.format || 'table' }}"
|
|
44
|
+
|
|
45
|
+
- name: Run scan (JSON artifact)
|
|
46
|
+
if: always()
|
|
47
|
+
run: |
|
|
48
|
+
teeshield scan "${{ inputs.target }}" --format json -o scan-report.json || true
|
|
49
|
+
|
|
50
|
+
- name: Upload report
|
|
51
|
+
if: always()
|
|
52
|
+
uses: actions/upload-artifact@v4
|
|
53
|
+
with:
|
|
54
|
+
name: teeshield-report
|
|
55
|
+
path: scan-report.json
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
__pycache__/
|
|
2
|
+
*.py[cod]
|
|
3
|
+
*$py.class
|
|
4
|
+
*.egg-info/
|
|
5
|
+
dist/
|
|
6
|
+
build/
|
|
7
|
+
.eggs/
|
|
8
|
+
*.egg
|
|
9
|
+
.venv/
|
|
10
|
+
venv/
|
|
11
|
+
env/
|
|
12
|
+
.env
|
|
13
|
+
.env.*
|
|
14
|
+
*.log
|
|
15
|
+
.pytest_cache/
|
|
16
|
+
.ruff_cache/
|
|
17
|
+
.mypy_cache/
|
|
18
|
+
.coverage
|
|
19
|
+
htmlcov/
|
|
20
|
+
node_modules/
|
|
21
|
+
.DS_Store
|
|
22
|
+
Thumbs.db
|
|
23
|
+
*.swp
|
|
24
|
+
*.swo
|
|
25
|
+
reports/
|
|
26
|
+
|
|
27
|
+
# Test targets (cloned repos)
|
|
28
|
+
test-targets/
|
|
29
|
+
|
|
30
|
+
# Generated reports
|
|
31
|
+
*.report.json
|
|
32
|
+
fs-report.json
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# TeeShield Curation Report
|
|
2
|
+
|
|
3
|
+
Batch scan of top MCP servers. Generated by `teeshield scan`.
|
|
4
|
+
|
|
5
|
+
## Summary
|
|
6
|
+
|
|
7
|
+
| Server | Tools | Security | Description | Arch | Overall | Rating | Rewrite Gain |
|
|
8
|
+
|--------|-------|----------|-------------|------|---------|--------|-------------|
|
|
9
|
+
| filesystem (official) | 14 | 10.0 | 3.2 | 10.0 | 7.6 | B | +4.8 |
|
|
10
|
+
| memory (official) | 9 | 10.0 | 2.3 | 10.0 | 7.3 | B | - |
|
|
11
|
+
| git (official) | 12 | 10.0 | 2.4 | 10.0 | 7.3 | B | +6.6 |
|
|
12
|
+
| fetch (official) | 1 | 9.0 | 3.5 | 10.0 | 7.3 | B | - |
|
|
13
|
+
| time (official) | 0 | 10.0 | 5.0 | 10.0 | 8.2 | A | - |
|
|
14
|
+
| everything (python-sdk) | 13 | 10.0 | 2.8 | 7.0 | 6.7 | B | - |
|
|
15
|
+
| supabase (community) | 30 | 9.0 | 2.3 | 8.0 | 6.4 | B | +5.6 |
|
|
16
|
+
|
|
17
|
+
**Totals:** 7 servers, 79 tools scanned
|
|
18
|
+
|
|
19
|
+
## Key Findings
|
|
20
|
+
|
|
21
|
+
### 1. Description quality is universally poor
|
|
22
|
+
- Average description score: **3.1/10**
|
|
23
|
+
- 0% of tools have scenario triggers ("Use when...")
|
|
24
|
+
- 0% of tools have parameter examples
|
|
25
|
+
- <5% have error guidance
|
|
26
|
+
- This confirms the Neon finding: tool descriptions are the #1 bottleneck for agent tool selection
|
|
27
|
+
|
|
28
|
+
### 2. Rewriting delivers massive gains
|
|
29
|
+
|
|
30
|
+
**Template-based (zero cost):**
|
|
31
|
+
- filesystem: 3.7 -> 8.5 (+4.8 points)
|
|
32
|
+
- git: 2.9 -> 9.5 (+6.6 points)
|
|
33
|
+
- supabase: 3.4 -> 9.0 (+5.6 points)
|
|
34
|
+
- Average improvement: +5.7 points
|
|
35
|
+
|
|
36
|
+
**Claude API (higher quality):**
|
|
37
|
+
- filesystem: 3.7 -> 9.6 (+5.9 points)
|
|
38
|
+
- memory: 3.4 -> 9.4 (+6.0 points)
|
|
39
|
+
- git: 2.9 -> 8.6 (+5.7 points)
|
|
40
|
+
- fetch: 3.5 -> 9.6 (+6.1 points)
|
|
41
|
+
- **Average improvement: +5.9 points with Claude API**
|
|
42
|
+
|
|
43
|
+
### 3. Security is generally solid
|
|
44
|
+
- Average security score: **9.7/10**
|
|
45
|
+
- Official servers score 10.0 (clean)
|
|
46
|
+
- Community servers have minor issues (SSRF in fetch, credential handling)
|
|
47
|
+
- No critical vulnerabilities found in production servers
|
|
48
|
+
|
|
49
|
+
### 4. Architecture quality varies
|
|
50
|
+
- Official servers: strong (10.0) - tests, error handling, types
|
|
51
|
+
- Community servers: moderate (7-8) - often missing tests
|
|
52
|
+
|
|
53
|
+
## Top Curation Candidates
|
|
54
|
+
|
|
55
|
+
Servers that would benefit most from TeeShield curation (high tool count + low description quality):
|
|
56
|
+
|
|
57
|
+
1. **supabase** - 30 tools, desc 2.3/10, improvement potential +5.6
|
|
58
|
+
2. **filesystem** - 14 tools, desc 3.2/10, improvement potential +4.8
|
|
59
|
+
3. **everything** - 13 tools, desc 2.8/10
|
|
60
|
+
4. **git** - 12 tools, desc 2.4/10, improvement potential +6.6
|
|
61
|
+
5. **memory** - 9 tools, desc 2.3/10
|
|
62
|
+
|
|
63
|
+
## Not Yet Scanned (need pattern support)
|
|
64
|
+
- Playwright MCP (compiled JS only, no source TS)
|
|
65
|
+
- GitHub MCP (Go, not yet supported)
|
|
66
|
+
- Context7 (clone failed)
|
|
67
|
+
- AWS MCP servers
|
|
68
|
+
- Desktop Commander
|
teeshield-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AgentShield
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
teeshield-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: teeshield
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Scan, improve, and certify MCP servers and AI agent skills
|
|
5
|
+
Author: TeeShield
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Keywords: ai-agent,mcp,security,skill-rating,tool-firewall
|
|
9
|
+
Classifier: Development Status :: 3 - Alpha
|
|
10
|
+
Classifier: Intended Audience :: Developers
|
|
11
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Topic :: Security
|
|
14
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
15
|
+
Requires-Python: >=3.11
|
|
16
|
+
Requires-Dist: click>=8.1
|
|
17
|
+
Requires-Dist: httpx>=0.27
|
|
18
|
+
Requires-Dist: pydantic>=2.0
|
|
19
|
+
Requires-Dist: pyyaml>=6.0
|
|
20
|
+
Requires-Dist: rich>=13.0
|
|
21
|
+
Provides-Extra: ai
|
|
22
|
+
Requires-Dist: anthropic>=0.40; extra == 'ai'
|
|
23
|
+
Provides-Extra: dev
|
|
24
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
25
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
26
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# TeeShield — Security Scanner for MCP tools
|
|
30
|
+
|
|
31
|
+
Scan, rate, and harden MCP servers for AI agent safety.
|
|
32
|
+
|
|
33
|
+
## Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install -e ".[dev]"
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Usage
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# Scan an MCP server
|
|
43
|
+
teeshield scan ./path/to/server.py
|
|
44
|
+
|
|
45
|
+
# Rewrite tool descriptions (requires ANTHROPIC_API_KEY)
|
|
46
|
+
teeshield rewrite ./path/to/server.py --dry-run
|
|
47
|
+
|
|
48
|
+
# Harden a server (detect + fix security issues)
|
|
49
|
+
teeshield harden ./path/to/server.py
|
|
50
|
+
|
|
51
|
+
# Evaluate tool selection accuracy before/after
|
|
52
|
+
teeshield eval ./original.py ./improved.py
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Rating Scale
|
|
56
|
+
|
|
57
|
+
| Rating | Score | Meaning |
|
|
58
|
+
|--------|-------|---------|
|
|
59
|
+
| A+ | 9.0+ | Production-ready, fully certified |
|
|
60
|
+
| A | 8.0+ | Safe with minor suggestions |
|
|
61
|
+
| B | 6.0+ | Usable, needs improvements |
|
|
62
|
+
| C | 4.0+ | Significant issues found |
|
|
63
|
+
| F | <4.0 | Unsafe, do not deploy |
|
|
64
|
+
|
|
65
|
+
## License
|
|
66
|
+
|
|
67
|
+
MIT
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# TeeShield — Security Scanner for MCP tools
|
|
2
|
+
|
|
3
|
+
Scan, rate, and harden MCP servers for AI agent safety.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pip install -e ".[dev]"
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Scan an MCP server
|
|
15
|
+
teeshield scan ./path/to/server.py
|
|
16
|
+
|
|
17
|
+
# Rewrite tool descriptions (requires ANTHROPIC_API_KEY)
|
|
18
|
+
teeshield rewrite ./path/to/server.py --dry-run
|
|
19
|
+
|
|
20
|
+
# Harden a server (detect + fix security issues)
|
|
21
|
+
teeshield harden ./path/to/server.py
|
|
22
|
+
|
|
23
|
+
# Evaluate tool selection accuracy before/after
|
|
24
|
+
teeshield eval ./original.py ./improved.py
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Rating Scale
|
|
28
|
+
|
|
29
|
+
| Rating | Score | Meaning |
|
|
30
|
+
|--------|-------|---------|
|
|
31
|
+
| A+ | 9.0+ | Production-ready, fully certified |
|
|
32
|
+
| A | 8.0+ | Safe with minor suggestions |
|
|
33
|
+
| B | 6.0+ | Usable, needs improvements |
|
|
34
|
+
| C | 4.0+ | Significant issues found |
|
|
35
|
+
| F | <4.0 | Unsafe, do not deploy |
|
|
36
|
+
|
|
37
|
+
## License
|
|
38
|
+
|
|
39
|
+
MIT
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
name: 'TeeShield Scan'
|
|
2
|
+
description: 'Scan an MCP server for security issues, description quality, and architecture'
|
|
3
|
+
branding:
|
|
4
|
+
icon: 'shield'
|
|
5
|
+
color: 'blue'
|
|
6
|
+
|
|
7
|
+
inputs:
|
|
8
|
+
target:
|
|
9
|
+
description: 'Path to MCP server directory'
|
|
10
|
+
required: true
|
|
11
|
+
default: '.'
|
|
12
|
+
fail-below:
|
|
13
|
+
description: 'Fail if overall score is below this threshold (0-10)'
|
|
14
|
+
required: false
|
|
15
|
+
default: '0'
|
|
16
|
+
format:
|
|
17
|
+
description: 'Output format (table or json)'
|
|
18
|
+
required: false
|
|
19
|
+
default: 'table'
|
|
20
|
+
|
|
21
|
+
outputs:
|
|
22
|
+
score:
|
|
23
|
+
description: 'Overall scan score (0-10)'
|
|
24
|
+
value: ${{ steps.scan.outputs.score }}
|
|
25
|
+
rating:
|
|
26
|
+
description: 'Rating (F/C/B/A/A+)'
|
|
27
|
+
value: ${{ steps.scan.outputs.rating }}
|
|
28
|
+
tool-count:
|
|
29
|
+
description: 'Number of tools detected'
|
|
30
|
+
value: ${{ steps.scan.outputs.tool_count }}
|
|
31
|
+
|
|
32
|
+
runs:
|
|
33
|
+
using: 'composite'
|
|
34
|
+
steps:
|
|
35
|
+
- name: Set up Python
|
|
36
|
+
uses: actions/setup-python@v5
|
|
37
|
+
with:
|
|
38
|
+
python-version: '3.12'
|
|
39
|
+
|
|
40
|
+
- name: Install TeeShield
|
|
41
|
+
shell: bash
|
|
42
|
+
run: pip install teeshield
|
|
43
|
+
|
|
44
|
+
- name: Run scan
|
|
45
|
+
id: scan
|
|
46
|
+
shell: bash
|
|
47
|
+
run: |
|
|
48
|
+
teeshield scan "${{ inputs.target }}" --format "${{ inputs.format }}"
|
|
49
|
+
|
|
50
|
+
# Parse JSON for outputs
|
|
51
|
+
REPORT=$(teeshield scan "${{ inputs.target }}" --format json 2>/dev/null)
|
|
52
|
+
echo "score=$(echo "$REPORT" | python -c 'import sys,json; print(json.loads(sys.stdin.read(), strict=False)["overall_score"])')" >> $GITHUB_OUTPUT
|
|
53
|
+
echo "rating=$(echo "$REPORT" | python -c 'import sys,json; print(json.loads(sys.stdin.read(), strict=False)["rating"])')" >> $GITHUB_OUTPUT
|
|
54
|
+
echo "tool_count=$(echo "$REPORT" | python -c 'import sys,json; print(json.loads(sys.stdin.read(), strict=False)["tool_count"])')" >> $GITHUB_OUTPUT
|
|
55
|
+
|
|
56
|
+
- name: Check threshold
|
|
57
|
+
if: inputs.fail-below != '0'
|
|
58
|
+
shell: bash
|
|
59
|
+
run: |
|
|
60
|
+
SCORE="${{ steps.scan.outputs.score }}"
|
|
61
|
+
THRESHOLD="${{ inputs.fail-below }}"
|
|
62
|
+
if (( $(echo "$SCORE < $THRESHOLD" | bc -l) )); then
|
|
63
|
+
echo "::error::TeeShield score $SCORE is below threshold $THRESHOLD"
|
|
64
|
+
exit 1
|
|
65
|
+
fi
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "fetch",
|
|
4
|
+
"original": "Fetches a URL from the internet and optionally extracts its contents as markdown.\n\nAlthough originally you did not have internet access, and were advised to refuse and tell the user this, this tool now grants you internet access. Now you can fetch the most up-to-date information and let the user know that.",
|
|
5
|
+
"rewritten": "Fetch content from any URL on the internet and convert it to readable markdown format.\n\nUse when the user wants to access current web content, read articles, check documentation, retrieve data from APIs, or get up-to-date information from websites. This tool provides you with internet access to fetch the latest information.\n\nKey parameters:\n- url: The web address to fetch (e.g., \"https://example.com\", \"https://api.github.com/repos/owner/repo\")\n- extract_contents: Boolean flag to convert HTML to clean markdown (default: true for better readability)\n\nCommon errors and handling:\n- Invalid URLs: Ensure proper format with http:// or https://\n- Blocked content: Some sites may restrict access or require authentication\n- Large files: Tool may timeout on very large responses\n- Network issues: Retry if initial fetch fails\n\nThis tool automatically converts web pages to markdown for easier reading and analysis. The markdown extraction removes clutter like ads and navigation, focusing on main content. Use this for any web-based information retrieval task where you need current, live data rather than your training knowledge."
|
|
6
|
+
}
|
|
7
|
+
]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "git_status",
|
|
4
|
+
"original": "Shows the working tree status",
|
|
5
|
+
"rewritten": "Query the current state of the Git working directory and staging area. Use when the user wants to see which files are modified, staged, untracked, or have merge conflicts.\n\nThis tool shows:\n- Modified files (red in terminal)\n- Staged files ready for commit (green in terminal) \n- Untracked files not yet added to Git\n- Files with merge conflicts\n- Current branch information\n\nUse this BEFORE other Git operations to understand what changes exist. For example, check status before running git_add to see which files need staging, or before git_commit to verify what will be committed.\n\nUnlike git_diff tools that show actual content changes, git_status only shows which files have changed. Use git_diff_unstaged to see unstaged changes, git_diff_staged for staged changes, or git_diff for any specific comparison.\n\nThe tool requires no parameters and works from any directory within a Git repository. If run outside a Git repository, it will return an error indicating no Git repository was found."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "git_diff_unstaged",
|
|
9
|
+
"original": "Shows changes in the working directory that are not yet staged",
|
|
10
|
+
"rewritten": "Show unstaged changes in the working directory that haven't been added to the staging area yet. Use when the user wants to review modifications before staging them, see what files have been changed, or understand the diff between the current working state and the last commit.\n\nThis command reveals local edits that exist only in your working directory - changes you've made but haven't yet prepared for commit with `git add`. Perfect for reviewing your work before staging, checking if you've made unintended modifications, or understanding what's different from the committed state.\n\nReturns unified diff format showing additions (+), deletions (-), and modified lines with context. If no unstaged changes exist, returns empty output.\n\n**When to use this vs similar tools:**\n- Use `git_diff_unstaged` for working directory changes not yet staged\n- Use `git_diff_staged` for changes already added but not committed \n- Use `git_diff` for comparing specific commits or branches\n- Use `git_status` for a high-level overview without detailed diffs\n\nCommon scenario: After editing files, run this to see exactly what you've changed before deciding what to stage with `git_add`."
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "git_diff_staged",
|
|
14
|
+
"original": "Shows changes that are staged for commit",
|
|
15
|
+
"rewritten": "Show the differences between staged files and the last commit. Use when the user wants to review changes before committing, verify what will be included in the next commit, or check staged modifications.\n\nThis displays only files added to the staging area with `git add`. If no changes are staged, returns empty output. Common scenarios include reviewing code before commit, checking if specific files were properly staged, or comparing staged content against the current HEAD.\n\nUse this instead of `git_diff_unstaged` (shows unstaged working directory changes) or `git_diff` (shows differences between any two references). If you need to see all changes (staged + unstaged), run both tools separately.\n\nReturns unified diff format showing additions (+), deletions (-), and context lines. If the repository has no commits yet, compares against an empty tree."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "git_diff",
|
|
19
|
+
"original": "Shows differences between branches or commits",
|
|
20
|
+
"rewritten": "Shows differences between specific branches, commits, or tags in a Git repository. Use when the user wants to compare code changes between two specific references, view what changed in a particular commit, or see differences between branches before merging.\n\n**Parameters:**\n- `from_ref`: Source reference (e.g., \"main\", \"HEAD~1\", \"abc123f\", \"v1.0\")\n- `to_ref`: Target reference (e.g., \"feature-branch\", \"HEAD\", \"def456a\")\n- `file_path`: Optional specific file to compare\n\n**Examples:**\n- Compare branches: `from_ref=\"main\"`, `to_ref=\"feature-auth\"`\n- View commit changes: `from_ref=\"HEAD~1\"`, `to_ref=\"HEAD\"`\n- Check tag differences: `from_ref=\"v1.0\"`, `to_ref=\"v1.1\"`\n\n**Use THIS tool when:** Comparing two specific Git references. Use `git_diff_staged` for staged changes, `git_diff_unstaged` for working directory changes, or `git_show` to view a single commit's details.\n\n**Common errors:** Invalid reference names will show an error - verify refs exist using `git_branch` or `git_log` first."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "git_commit",
|
|
24
|
+
"original": "Records changes to the repository",
|
|
25
|
+
"rewritten": "Record changes to the repository by creating a commit with a descriptive message.\n\nUse when the user wants to save their staged changes permanently to the Git history, typically after using git_add to stage files. This creates a snapshot of the current staged changes.\n\n**Parameters:**\n- `message`: Commit message describing the changes (e.g., \"Fix user authentication bug\", \"Add password validation feature\", \"Update documentation for API endpoints\")\n\n**Common workflow:** First use git_status to see changed files, git_add to stage desired changes, then git_commit to record them. If no files are staged, the commit will fail - use git_add first.\n\n**Error handling:** If commit fails due to no staged changes, check git_status and stage files with git_add. For empty commit messages, provide a descriptive message explaining what changed and why.\n\n**vs other tools:** Use git_add before this to stage changes, git_status to check what will be committed, and git_log after to view the new commit. Unlike git_show which displays existing commits, this creates new ones."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "git_add",
|
|
29
|
+
"original": "Adds file contents to the staging area",
|
|
30
|
+
"rewritten": "Stage files for the next commit by adding them to Git's staging area. Use when the user wants to prepare specific files or changes for committing, such as after making edits, creating new files, or selectively staging modifications.\n\nProvide file paths as parameters - use \".\" to stage all changes, specific filenames like \"src/main.py\", or glob patterns like \"*.js\". For new files, you must add them before they can be committed. For modified files, adding stages the current version.\n\nCommon scenarios: Stage all changes with \".\", stage specific files with exact paths, or stage by file type using patterns. If files aren't found, verify paths are relative to repository root.\n\nUse git_add (this tool) when preparing files for commit. Use git_status first to see which files need staging. Use git_diff_unstaged to review changes before staging, or git_diff_staged to see what's already staged. After staging, use git_commit to finalize changes. Use git_reset to unstage files if needed."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "git_reset",
|
|
34
|
+
"original": "Unstages all staged changes",
|
|
35
|
+
"rewritten": "Reset staged changes back to unstaged state, clearing the Git index while preserving working directory changes.\n\nUse when the user wants to undo staging operations, remove files from the index before committing, or cancel a partial commit preparation. This is the Git equivalent of \"git reset\" without arguments.\n\n**Key scenarios:**\n- User accidentally staged wrong files with git_add\n- User wants to re-organize which changes go into different commits\n- User needs to unstage everything to start fresh with selective staging\n\n**Important distinctions:**\n- Use git_reset when you want to unstage ALL currently staged changes\n- Use git_diff_staged first to see what will be unstaged\n- Unlike git_checkout, this doesn't modify file contents - only the staging area\n- Files remain modified in working directory; use git_status afterward to confirm\n\n**Common workflow:** Check git_status \u2192 Review git_diff_staged \u2192 Use git_reset \u2192 Re-add specific files with git_add\n\nThis tool affects the entire staging area at once. For examining what's currently staged before resetting, combine with git_diff_staged. After resetting, changes remain in working directory as unstaged modifications."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "git_log",
|
|
39
|
+
"original": "Shows the commit logs",
|
|
40
|
+
"rewritten": "Query commit history and view detailed log information for a Git repository. Use when the user wants to see past commits, review project history, find specific changes, or investigate when features were added.\n\nDisplays commit messages, authors, dates, and SHA hashes in chronological order. Supports filtering by author, date ranges, file paths, and commit count limits.\n\nParameter examples:\n- max_count: 10 (show last 10 commits)\n- author: \"john@example.com\" (commits by specific author)\n- since: \"2024-01-01\" (commits after date)\n- path: \"src/main.py\" (commits affecting specific file)\n\nCommon errors: Invalid date formats or non-existent file paths will return empty results. Very large repositories may need max_count limits for performance.\n\nUse git_log for viewing commit history vs git_show for detailed content of a specific commit, git_status for current working directory state, or git_diff for comparing changes between commits/branches."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "git_create_branch",
|
|
44
|
+
"original": "Creates a new branch from an optional base branch",
|
|
45
|
+
"rewritten": "Create a new Git branch from the current branch or a specified base branch. Use when the user wants to start new feature development, create experimental branches, or isolate work from the main codebase.\n\nRequires a branch name (e.g., \"feature/user-auth\", \"bugfix/login-error\", \"dev/new-api\"). Optionally specify a base branch to branch from (e.g., \"main\", \"develop\", \"v2.1\"). If no base is provided, branches from the currently checked-out branch.\n\nCommon usage patterns:\n- `git_create_branch` with name \"feature/payment-system\" (branches from current)\n- `git_create_branch` with name \"hotfix/security-patch\" and base \"main\"\n\nHandle errors gracefully: branch names with invalid characters will fail, and branching from non-existent base branches returns an error. Branch creation does not automatically switch to the new branch.\n\nUse this instead of `git_checkout` when you only need to create a branch without switching to it. Use `git_branch` to list existing branches or `git_checkout` to switch between branches after creation."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "git_checkout",
|
|
49
|
+
"original": "Switches branches",
|
|
50
|
+
"rewritten": "Switch to an existing Git branch or restore files to their last committed state. Use when the user wants to change their working branch, discard uncommitted changes to specific files, or revert files to a previous state.\n\nFor branch switching, provide the branch name (e.g., \"main\", \"feature/login\", \"dev\"). For file restoration, specify file paths (e.g., \"src/app.js\", \"*.py\" for patterns).\n\nCommon errors include switching to non-existent branches (use git_branch to list available branches first) or having uncommitted changes that conflict (use git_status to check, then git_add + git_commit or git_reset to resolve).\n\nUnlike git_create_branch which creates new branches, git_checkout only switches to existing ones. Unlike git_reset which affects the entire working directory, git_checkout can target specific files. Use git_status before checkout operations to understand your current state."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "git_show",
|
|
54
|
+
"original": "Shows the contents of a commit",
|
|
55
|
+
"rewritten": "Show the detailed contents and metadata of a specific git commit, including changed files, commit message, author, and date. Use when the user wants to examine what changes were made in a particular commit, review commit details, or investigate the history of specific modifications.\n\nProvide the commit hash (e.g., \"abc123f\", \"HEAD\", \"main~2\") as the primary parameter. Full hashes, short hashes, and git references are all supported. You can also specify additional options like --stat for summary statistics or --name-only for just filenames.\n\nCommon errors include invalid commit hashes (verify with git_log first) and commits that don't exist in the current branch. If a hash is ambiguous, git will prompt for clarification.\n\nUse git_show vs other tools: Choose git_show for examining completed commits, git_diff for comparing working directory changes, git_diff_staged for reviewing staged changes before committing, and git_log for browsing commit history without detailed content. git_show is ideal when you need both the commit metadata AND the actual code changes in one comprehensive view."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "git_branch",
|
|
59
|
+
"original": "List Git branches",
|
|
60
|
+
"rewritten": "List all Git branches in the repository, showing both local and remote branches with their tracking relationships.\n\nUse when the user wants to see available branches, check which branch is currently active, or understand the branch structure before switching branches or creating new ones.\n\nShows branches with indicators: \"*\" marks the current branch, local branches appear without prefixes, and remote branches display with \"remotes/\" prefix. Also displays tracking relationships between local and remote branches.\n\nIf the command fails, ensure you're in a valid Git repository. Empty repositories with no commits won't show any branches until the first commit is made.\n\nUse this tool instead of git_status when you specifically need branch information rather than working directory status. Use before git_checkout to see available branches, or before git_create_branch to avoid naming conflicts. Complements git_log when you need to understand branch history and relationships."
|
|
61
|
+
}
|
|
62
|
+
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "create_entities",
|
|
4
|
+
"original": "Create multiple new entities in the knowledge graph",
|
|
5
|
+
"rewritten": "Create multiple new entities simultaneously in the knowledge graph. Use when the user wants to add several related or unrelated entities at once, such as creating a set of people, locations, or concepts that will be interconnected later.\n\nProvide entities as an array where each entity includes:\n- name: unique identifier (e.g., \"John Smith\", \"Paris\", \"Machine Learning\")\n- entityType: category like \"Person\", \"Location\", \"Concept\", \"Organization\"\n- observations: optional array of descriptive facts\n\nExample: Creating entities for a business scenario - CEO, company, and headquarters location in one operation rather than individual create calls.\n\nCommon errors: Duplicate entity names will fail - ensure uniqueness across the entire graph. Empty names or invalid entityType values cause rejection.\n\nUse this instead of multiple individual entity creation calls when you have a batch of entities to add. Use create_relations afterward to connect these entities. For single entities, individual creation might be more appropriate. For adding descriptive information to existing entities, use add_observations instead."
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"name": "create_relations",
|
|
9
|
+
"original": "Create multiple new relations between entities in the knowledge graph. Relations should be in active voice",
|
|
10
|
+
"rewritten": "Create multiple new relations between entities in the knowledge graph using active voice statements. Use when the user wants to establish connections, relationships, or associations between existing entities.\n\nRelations must be expressed in active voice format where the subject performs an action on the object (e.g., \"Alice works at Google\", \"Python supports object-oriented programming\", \"The meeting occurs on Monday\").\n\n**Parameter Examples:**\n- Subject: \"Tesla\", Relation: \"manufactures\", Object: \"electric vehicles\"\n- Subject: \"Shakespeare\", Relation: \"wrote\", Object: \"Hamlet\"\n- Subject: \"Database\", Relation: \"stores\", Object: \"customer records\"\n\n**Common Errors:** Ensure both subject and object entities already exist in the graph before creating relations. Avoid passive voice constructions like \"was created by\" - use \"created\" instead.\n\n**When to Use This vs Other Tools:**\n- Use `create_entities` first if the entities don't exist yet\n- Use `add_observations` to attach descriptive properties to single entities\n- Use `search_nodes` to verify entities exist before relating them\n- This tool specifically handles entity-to-entity connections, not entity attributes"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "add_observations",
|
|
14
|
+
"original": "Add new observations to existing entities in the knowledge graph",
|
|
15
|
+
"rewritten": "Add new observations to existing entities in the knowledge graph. Use when the user wants to attach additional facts, properties, or descriptive information to entities that already exist in the graph.\n\nProvide the entity name exactly as it appears in the graph and include specific, factual observations. For example: entity \"John Smith\" with observations like \"works at Microsoft\", \"born in 1985\", or \"lives in Seattle\". Each observation should be a complete, standalone fact about the entity.\n\nCommon errors include referencing non-existent entities (use search_nodes first to verify) or adding vague observations like \"is good\" instead of specific facts like \"has 10 years experience in software engineering\".\n\nUse this tool instead of create_entities when the entity already exists and you only need to add more information. If the entity doesn't exist yet, use create_entities first. For connecting entities to each other, use create_relations instead of adding relational observations.\n\nThe tool will validate that the target entity exists before adding observations. If the entity is not found, search for it first or create it using create_entities."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "delete_entities",
|
|
19
|
+
"original": "Delete multiple entities and their associated relations from the knowledge graph",
|
|
20
|
+
"rewritten": "Delete multiple entities and their associated relations from the knowledge graph. Use when the user wants to remove outdated information, clean up duplicate entries, or purge entire concept clusters from their knowledge base.\n\nRequires entity IDs as parameters - these are the unique identifiers returned by search_nodes or read_graph operations. Example: [\"person_123\", \"company_456\", \"event_789\"]. This operation cascades automatically, removing all relations where these entities participate as either source or target.\n\nCommon errors occur when providing invalid entity IDs or attempting to delete non-existent entities - the tool will skip invalid IDs and continue with valid ones. Always verify entity existence using search_nodes before deletion if unsure.\n\nChoose this over delete_relations when you want to remove entire concepts rather than just their connections. Use delete_observations for removing specific factual claims while keeping the entities intact. For surgical removal of single relationships, use delete_relations instead.\n\nWarning: This operation is irreversible and will permanently remove entities and all their associated data from the knowledge graph."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "delete_observations",
|
|
24
|
+
"original": "Delete specific observations from entities in the knowledge graph",
|
|
25
|
+
"rewritten": "Delete specific observations from entities in the knowledge graph. Use when the user wants to remove outdated, incorrect, or unwanted observation data from existing entities while preserving the entities themselves.\n\nProvide the entity identifier and specify which observations to remove. For example, use entity_id=\"person_123\" and observation_key=\"age\" to remove age data, or observation_key=\"location\" to delete location information. You can target specific observation types like demographics, preferences, or historical data points.\n\nCommon errors include attempting to delete from non-existent entities (returns entity not found) or referencing invalid observation keys (returns key not found). Handle gracefully by verifying entity existence first using read_graph or search_nodes.\n\nUse delete_observations when you need surgical removal of specific data points. Choose delete_entities for complete entity removal, or delete_relations for removing connections between entities. This tool maintains entity structure while cleaning specific observation data, making it ideal for data correction, privacy compliance, or information updates without losing the underlying entity relationships."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "delete_relations",
|
|
29
|
+
"original": "Delete multiple relations from the knowledge graph",
|
|
30
|
+
"rewritten": "Delete multiple relations from the knowledge graph by specifying relation IDs. Use when the user wants to remove connections between entities, clean up incorrect relationships, or bulk delete outdated links.\n\nRequires an array of relation IDs to delete. For example, if deleting relations with IDs [\"rel_123\", \"rel_456\", \"rel_789\"], all three connections will be permanently removed from the graph.\n\nCommon errors include providing non-existent relation IDs (operation will fail for invalid IDs but succeed for valid ones) and attempting to delete relations that don't exist. Always verify relation IDs exist using read_graph or search_nodes before deletion.\n\nUse delete_relations when removing multiple connections at once. For single relation removal, this tool still works efficiently. For removing entities entirely (which also removes their relations), use delete_entities instead. For removing specific observations while keeping relations intact, use delete_observations.\n\nNote: Deletion is permanent and cannot be undone. Relations connect entities in the knowledge graph, so removing them will break those specific connections while leaving the entities themselves intact."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "read_graph",
|
|
34
|
+
"original": "Read the entire knowledge graph",
|
|
35
|
+
"rewritten": "Read and retrieve the complete knowledge graph structure including all entities, relationships, and observations. Use when the user wants to get a comprehensive overview of all stored knowledge, export the entire graph, or understand the full scope of available information before making queries or modifications.\n\nThis tool returns the entire graph dataset, making it ideal for initial exploration, data analysis, or when users ask broad questions like \"what do you know about?\" or \"show me everything.\" Unlike search_nodes (which finds specific matches) or open_nodes (which retrieves detailed node information), this provides the complete graph structure at once.\n\nNo parameters required - simply call to get all graph data. Handle large datasets carefully as this returns everything stored. If the graph is extensive, consider suggesting search_nodes for targeted queries instead. Common use cases include graph visualization preparation, full data exports, or comprehensive knowledge reviews.\n\nNote: For focused information retrieval, use search_nodes to find specific entities or open_nodes to get detailed node data rather than reading the entire graph."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "search_nodes",
|
|
39
|
+
"original": "Search for nodes in the knowledge graph based on a query",
|
|
40
|
+
"rewritten": "Query the knowledge graph to find nodes matching specific search criteria. Use when the user wants to locate existing entities, find nodes by name or properties, or explore what's already stored in the graph before creating new content.\n\nProvide search terms that match node names, types, or attributes. For example: search for \"John Smith\" to find person entities, \"meeting\" to locate event nodes, or \"project alpha\" to find specific project entities. The search is typically case-insensitive and supports partial matching.\n\nCommon errors occur when searching too broadly (returns too many results) or too narrowly (returns nothing). Start with specific terms and broaden if needed. If no results appear, try alternative spellings or related terms.\n\nUse search_nodes BEFORE create_entities to avoid duplicates - always check if an entity already exists. Use read_graph when you need the complete graph structure, and open_nodes when you need to examine specific nodes you already know exist. This tool is for discovery and exploration of unknown content in the knowledge graph."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "open_nodes",
|
|
44
|
+
"original": "Open specific nodes in the knowledge graph by their names",
|
|
45
|
+
"rewritten": "Open specific nodes in the knowledge graph by retrieving their detailed information using node names. Use when the user wants to examine particular entities they know by name, get comprehensive details about specific concepts, or drill down into individual nodes after discovering them through search.\n\nProvide exact node names as they appear in the graph - names are case-sensitive and must match precisely. For example, use \"Apple Inc.\" not \"apple inc\" or \"Apple\". Multiple nodes can be opened simultaneously by providing a list of names.\n\nCommon errors include misspelled names or using partial matches - if a node isn't found, try searching first with search_nodes to find the correct name format. Unlike search_nodes which finds nodes by partial text matching, open_nodes requires exact name matches and returns complete node data including all properties and relationships.\n\nUse this tool when you have specific node names and need their full details, versus search_nodes for discovery, read_graph for overall structure, or create_entities for adding new nodes."
|
|
46
|
+
}
|
|
47
|
+
]
|