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.
Files changed (34) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +213 -0
  3. package/bin/pylance-mcp.js +68 -0
  4. package/mcp_server/__init__.py +13 -0
  5. package/mcp_server/__pycache__/__init__.cpython-312.pyc +0 -0
  6. package/mcp_server/__pycache__/__init__.cpython-313.pyc +0 -0
  7. package/mcp_server/__pycache__/__init__.cpython-314.pyc +0 -0
  8. package/mcp_server/__pycache__/ai_features.cpython-313.pyc +0 -0
  9. package/mcp_server/__pycache__/api_routes.cpython-313.pyc +0 -0
  10. package/mcp_server/__pycache__/auth.cpython-313.pyc +0 -0
  11. package/mcp_server/__pycache__/cloud_sync.cpython-313.pyc +0 -0
  12. package/mcp_server/__pycache__/logging_db.cpython-312.pyc +0 -0
  13. package/mcp_server/__pycache__/logging_db.cpython-313.pyc +0 -0
  14. package/mcp_server/__pycache__/pylance_bridge.cpython-312.pyc +0 -0
  15. package/mcp_server/__pycache__/pylance_bridge.cpython-313.pyc +0 -0
  16. package/mcp_server/__pycache__/pylance_bridge.cpython-314.pyc +0 -0
  17. package/mcp_server/__pycache__/resources.cpython-312.pyc +0 -0
  18. package/mcp_server/__pycache__/resources.cpython-313.pyc +0 -0
  19. package/mcp_server/__pycache__/tools.cpython-312.pyc +0 -0
  20. package/mcp_server/__pycache__/tools.cpython-313.pyc +0 -0
  21. package/mcp_server/__pycache__/tracing.cpython-313.pyc +0 -0
  22. package/mcp_server/ai_features.py +274 -0
  23. package/mcp_server/api_routes.py +429 -0
  24. package/mcp_server/auth.py +275 -0
  25. package/mcp_server/cloud_sync.py +427 -0
  26. package/mcp_server/logging_db.py +403 -0
  27. package/mcp_server/pylance_bridge.py +579 -0
  28. package/mcp_server/resources.py +174 -0
  29. package/mcp_server/tools.py +642 -0
  30. package/mcp_server/tracing.py +84 -0
  31. package/package.json +53 -0
  32. package/requirements.txt +29 -0
  33. package/scripts/check-python.js +57 -0
  34. 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
+ }
@@ -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
+ }