pylance-mcp-server 1.0.0
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.
- package/LICENSE +21 -0
- package/README.md +213 -0
- package/bin/pylance-mcp.js +68 -0
- package/mcp_server/__init__.py +13 -0
- package/mcp_server/__pycache__/__init__.cpython-312.pyc +0 -0
- package/mcp_server/__pycache__/__init__.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/__init__.cpython-314.pyc +0 -0
- package/mcp_server/__pycache__/ai_features.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/api_routes.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/auth.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/cloud_sync.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/logging_db.cpython-312.pyc +0 -0
- package/mcp_server/__pycache__/logging_db.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/pylance_bridge.cpython-312.pyc +0 -0
- package/mcp_server/__pycache__/pylance_bridge.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/pylance_bridge.cpython-314.pyc +0 -0
- package/mcp_server/__pycache__/resources.cpython-312.pyc +0 -0
- package/mcp_server/__pycache__/resources.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/tools.cpython-312.pyc +0 -0
- package/mcp_server/__pycache__/tools.cpython-313.pyc +0 -0
- package/mcp_server/__pycache__/tracing.cpython-313.pyc +0 -0
- package/mcp_server/ai_features.py +274 -0
- package/mcp_server/api_routes.py +429 -0
- package/mcp_server/auth.py +275 -0
- package/mcp_server/cloud_sync.py +427 -0
- package/mcp_server/logging_db.py +403 -0
- package/mcp_server/pylance_bridge.py +579 -0
- package/mcp_server/resources.py +174 -0
- package/mcp_server/tools.py +642 -0
- package/mcp_server/tracing.py +84 -0
- package/package.json +53 -0
- package/requirements.txt +29 -0
- package/scripts/check-python.js +57 -0
- package/server.py +1228 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""
|
|
2
|
+
OpenTelemetry Tracing Configuration
|
|
3
|
+
|
|
4
|
+
Sets up distributed tracing for the Pylance MCP Server using OpenTelemetry.
|
|
5
|
+
Sends traces to AI Toolkit's local OTLP collector.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Optional
|
|
10
|
+
from opentelemetry import trace
|
|
11
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
12
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
13
|
+
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
|
|
14
|
+
from opentelemetry.sdk.resources import Resource
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
_tracer: Optional[trace.Tracer] = None
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def setup_tracing(service_name: str = "pylance-mcp-server", otlp_endpoint: str = "http://localhost:4318") -> trace.Tracer:
|
|
22
|
+
"""
|
|
23
|
+
Initialize OpenTelemetry tracing with OTLP exporter.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
service_name: Name of the service for trace identification
|
|
27
|
+
otlp_endpoint: OTLP HTTP endpoint (default: AI Toolkit's localhost endpoint)
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
Configured tracer instance
|
|
31
|
+
"""
|
|
32
|
+
global _tracer
|
|
33
|
+
|
|
34
|
+
if _tracer is not None:
|
|
35
|
+
logger.info("Tracing already initialized")
|
|
36
|
+
return _tracer
|
|
37
|
+
|
|
38
|
+
try:
|
|
39
|
+
# Create resource with service information
|
|
40
|
+
resource = Resource.create({
|
|
41
|
+
"service.name": service_name,
|
|
42
|
+
"service.version": "1.0.0",
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
# Set up the tracer provider
|
|
46
|
+
provider = TracerProvider(resource=resource)
|
|
47
|
+
|
|
48
|
+
# Configure OTLP exporter for AI Toolkit
|
|
49
|
+
otlp_exporter = OTLPSpanExporter(
|
|
50
|
+
endpoint=f"{otlp_endpoint}/v1/traces",
|
|
51
|
+
timeout=5,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Add span processor
|
|
55
|
+
span_processor = BatchSpanProcessor(otlp_exporter)
|
|
56
|
+
provider.add_span_processor(span_processor)
|
|
57
|
+
|
|
58
|
+
# Set as global tracer provider
|
|
59
|
+
trace.set_tracer_provider(provider)
|
|
60
|
+
|
|
61
|
+
# Get tracer instance
|
|
62
|
+
_tracer = trace.get_tracer(__name__)
|
|
63
|
+
|
|
64
|
+
logger.info(f"OpenTelemetry tracing initialized: {service_name} -> {otlp_endpoint}")
|
|
65
|
+
return _tracer
|
|
66
|
+
|
|
67
|
+
except Exception as e:
|
|
68
|
+
logger.error(f"Failed to initialize tracing: {e}")
|
|
69
|
+
# Return no-op tracer on failure
|
|
70
|
+
_tracer = trace.get_tracer(__name__)
|
|
71
|
+
return _tracer
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def get_tracer() -> trace.Tracer:
|
|
75
|
+
"""
|
|
76
|
+
Get the configured tracer instance.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
Tracer instance (initializes with defaults if not already set up)
|
|
80
|
+
"""
|
|
81
|
+
global _tracer
|
|
82
|
+
if _tracer is None:
|
|
83
|
+
return setup_tracing()
|
|
84
|
+
return _tracer
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pylance-mcp-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Pyright/Pylance language server for MCP - Enhanced Python IntelliSense for Claude Desktop",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"pylance-mcp-server": "./bin/pylance-mcp.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"postinstall": "node scripts/check-python.js && pip install -r requirements.txt",
|
|
11
|
+
"test": "python quick_test.py"
|
|
12
|
+
},
|
|
13
|
+
"keywords": [
|
|
14
|
+
"mcp",
|
|
15
|
+
"model-context-protocol",
|
|
16
|
+
"pylance",
|
|
17
|
+
"pyright",
|
|
18
|
+
"python",
|
|
19
|
+
"language-server",
|
|
20
|
+
"claude",
|
|
21
|
+
"ai",
|
|
22
|
+
"code-intelligence",
|
|
23
|
+
"type-checking",
|
|
24
|
+
"intellisense"
|
|
25
|
+
],
|
|
26
|
+
"author": "JarrodAI",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/JarrodAI/pylance-mcp.git"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://pylancemcp.com",
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=16.0.0"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"python": ">=3.8"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"dotenv": "^17.2.3",
|
|
41
|
+
"node-appwrite": "^14.0.1",
|
|
42
|
+
"pyright": "^1.1.350"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"server.py",
|
|
46
|
+
"mcp_server/",
|
|
47
|
+
"requirements.txt",
|
|
48
|
+
"bin/",
|
|
49
|
+
"scripts/",
|
|
50
|
+
"README.md",
|
|
51
|
+
"LICENSE"
|
|
52
|
+
]
|
|
53
|
+
}
|
package/requirements.txt
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Core dependencies
|
|
2
|
+
fastmcp>=0.2.0
|
|
3
|
+
pydantic>=2.0.0
|
|
4
|
+
aiofiles>=23.0.0
|
|
5
|
+
uvicorn>=0.24.0
|
|
6
|
+
requests>=2.31.0
|
|
7
|
+
anthropic>=0.40.0
|
|
8
|
+
supabase>=2.3.0
|
|
9
|
+
fastapi>=0.115.0
|
|
10
|
+
|
|
11
|
+
# OpenTelemetry for tracing
|
|
12
|
+
opentelemetry-api>=1.20.0
|
|
13
|
+
opentelemetry-sdk>=1.20.0
|
|
14
|
+
opentelemetry-exporter-otlp>=1.20.0
|
|
15
|
+
opentelemetry-instrumentation>=0.41b0
|
|
16
|
+
|
|
17
|
+
# Linting and formatting
|
|
18
|
+
ruff>=0.1.0
|
|
19
|
+
|
|
20
|
+
# Security and code quality
|
|
21
|
+
bandit>=1.7.5
|
|
22
|
+
radon>=6.0.1
|
|
23
|
+
|
|
24
|
+
# Development dependencies
|
|
25
|
+
pytest>=7.4.0
|
|
26
|
+
pytest-asyncio>=0.21.0
|
|
27
|
+
black>=23.0.0
|
|
28
|
+
isort>=5.12.0
|
|
29
|
+
mypy>=1.5.0
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Check Python Installation
|
|
5
|
+
*
|
|
6
|
+
* Verifies that Python 3.8+ is installed before proceeding with package installation.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { spawnSync } = require('child_process');
|
|
10
|
+
|
|
11
|
+
function checkPython() {
|
|
12
|
+
const pythonCommands = ['python3', 'python', 'py'];
|
|
13
|
+
|
|
14
|
+
for (const cmd of pythonCommands) {
|
|
15
|
+
try {
|
|
16
|
+
const result = spawnSync(cmd, ['--version'], {
|
|
17
|
+
encoding: 'utf-8',
|
|
18
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
if (result.status === 0) {
|
|
22
|
+
const versionOutput = result.stdout || result.stderr || '';
|
|
23
|
+
const versionMatch = versionOutput.match(/Python (\d+)\.(\d+)/);
|
|
24
|
+
|
|
25
|
+
if (versionMatch) {
|
|
26
|
+
const major = parseInt(versionMatch[1]);
|
|
27
|
+
const minor = parseInt(versionMatch[2]);
|
|
28
|
+
|
|
29
|
+
if (major === 3 && minor >= 8) {
|
|
30
|
+
console.log(`✓ Found ${versionOutput.trim()}`);
|
|
31
|
+
return true;
|
|
32
|
+
} else if (major > 3) {
|
|
33
|
+
console.log(`✓ Found ${versionOutput.trim()}`);
|
|
34
|
+
return true;
|
|
35
|
+
} else {
|
|
36
|
+
console.warn(`⚠ Found ${versionOutput.trim()} but Python 3.8+ is required`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
} catch (e) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.error('\n❌ Python 3.8+ is required but not found.');
|
|
46
|
+
console.error('\nPlease install Python:');
|
|
47
|
+
console.error(' • Windows/Mac: https://www.python.org/downloads/');
|
|
48
|
+
console.error(' • Linux: sudo apt install python3 python3-pip');
|
|
49
|
+
console.error('\nAfter installing Python, run: npm install pylance-mcp-server');
|
|
50
|
+
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Only check if not in CI environment
|
|
55
|
+
if (!process.env.CI && !process.env.SKIP_PYTHON_CHECK) {
|
|
56
|
+
checkPython();
|
|
57
|
+
}
|