Skip to content

Commit eda69cf

Browse files
committed
feat(mcp): implement http transport support
1 parent fed12db commit eda69cf

File tree

11 files changed

+350
-92
lines changed

11 files changed

+350
-92
lines changed

.vscode/tasks.json

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,36 @@
6868
},
6969
"problemMatcher": []
7070
},
71+
{
72+
"label": "uv run main.py --transport streamable-http --no-setup",
73+
"detail": "Start HTTP MCP server on localhost:8000/mcp",
74+
"type": "shell",
75+
"command": "uv",
76+
"args": [
77+
"run",
78+
"main.py",
79+
"--transport",
80+
"streamable-http",
81+
"--host",
82+
"127.0.0.1",
83+
"--port",
84+
"8000",
85+
"--path",
86+
"/mcp",
87+
"--no-setup"
88+
],
89+
"isBackground": true,
90+
"group": {
91+
"kind": "build",
92+
"isDefault": false
93+
},
94+
"presentation": {
95+
"reveal": "always",
96+
"panel": "new",
97+
"focus": true
98+
},
99+
"problemMatcher": []
100+
},
71101
{
72102
"label": "uv run tail -n 20 -F ~/Library/Logs/Claude/mcp*.log",
73103
"detail": "Follow Claude Desktop logs",

linkedin_mcp_server/config/loaders.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,30 @@ def load_from_args(config: AppConfig) -> AppConfig:
8080

8181
parser.add_argument(
8282
"--transport",
83-
choices=["stdio", "sse"],
83+
choices=["stdio", "streamable-http"],
8484
default=None,
85-
help="Specify the transport mode (stdio or sse)",
85+
help="Specify the transport mode (stdio or streamable-http)",
86+
)
87+
88+
parser.add_argument(
89+
"--host",
90+
type=str,
91+
default=None,
92+
help="HTTP server host (default: 127.0.0.1)",
93+
)
94+
95+
parser.add_argument(
96+
"--port",
97+
type=int,
98+
default=None,
99+
help="HTTP server port (default: 8000)",
100+
)
101+
102+
parser.add_argument(
103+
"--path",
104+
type=str,
105+
default=None,
106+
help="HTTP server path (default: /mcp)",
86107
)
87108

88109
parser.add_argument(
@@ -109,6 +130,15 @@ def load_from_args(config: AppConfig) -> AppConfig:
109130
if args.transport:
110131
config.server.transport = args.transport
111132

133+
if args.host:
134+
config.server.host = args.host
135+
136+
if args.port:
137+
config.server.port = args.port
138+
139+
if args.path:
140+
config.server.path = args.path
141+
112142
if args.chromedriver:
113143
config.chrome.chromedriver_path = args.chromedriver
114144

linkedin_mcp_server/config/schema.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,14 @@ class LinkedInConfig:
2626
class ServerConfig:
2727
"""MCP server configuration."""
2828

29-
transport: Literal["stdio", "sse"] = "stdio"
29+
transport: Literal["stdio", "streamable-http"] = "stdio"
3030
lazy_init: bool = True
3131
debug: bool = False
3232
setup: bool = True
33+
# HTTP transport configuration
34+
host: str = "127.0.0.1"
35+
port: int = 8000
36+
path: str = "/mcp"
3337

3438

3539
@dataclass

linkedin_mcp_server/server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"""
77

88
from typing import Dict, Any
9-
from mcp.server.fastmcp import FastMCP
9+
from fastmcp import FastMCP
1010

1111
from linkedin_mcp_server.drivers.chrome import active_drivers
1212
from linkedin_mcp_server.tools.person import register_person_tools

linkedin_mcp_server/tools/company.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"""
77

88
from typing import Dict, Any, List
9-
from mcp.server.fastmcp import FastMCP
9+
from fastmcp import FastMCP
1010
from linkedin_scraper import Company
1111

1212
from linkedin_mcp_server.drivers.chrome import get_or_create_driver

linkedin_mcp_server/tools/job.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from typing import Any, Dict, List
99

1010
from linkedin_scraper import Job, JobSearch
11-
from mcp.server.fastmcp import FastMCP
11+
from fastmcp import FastMCP
1212

1313
from linkedin_mcp_server.drivers.chrome import get_or_create_driver
1414

linkedin_mcp_server/tools/person.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"""
77

88
from typing import Dict, Any, List
9-
from mcp.server.fastmcp import FastMCP
9+
from fastmcp import FastMCP
1010
from linkedin_scraper import Person
1111

1212
from linkedin_mcp_server.drivers.chrome import get_or_create_driver

main.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
from linkedin_mcp_server.server import create_mcp_server, shutdown_handler
1616

1717

18-
def choose_transport_interactive() -> Literal["stdio", "sse"]:
18+
def choose_transport_interactive() -> Literal["stdio", "streamable-http"]:
1919
"""Prompt user for transport mode using inquirer."""
2020
questions = [
2121
inquirer.List(
2222
"transport",
2323
message="Choose mcp transport mode",
2424
choices=[
2525
("stdio (Default CLI mode)", "stdio"),
26-
("sse (Server-Sent Events HTTP mode)", "sse"),
26+
("streamable-http (HTTP server mode)", "streamable-http"),
2727
],
2828
default="stdio",
2929
)
@@ -67,7 +67,18 @@ def main() -> None:
6767

6868
# Start server
6969
print(f"\n🚀 Running LinkedIn MCP server ({transport.upper()} mode)...")
70-
mcp.run(transport=transport)
70+
if transport == "streamable-http":
71+
print(
72+
f"📡 HTTP server will be available at http://{config.server.host}:{config.server.port}{config.server.path}"
73+
)
74+
mcp.run(
75+
transport=transport,
76+
host=config.server.host,
77+
port=config.server.port,
78+
path=config.server.path,
79+
)
80+
else:
81+
mcp.run(transport=transport)
7182

7283

7384
def exit_gracefully(exit_code: int = 0) -> None:

pyproject.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ description = "MCP server for LinkedIn profile, company, and job scraping with C
55
readme = "README.md"
66
requires-python = ">=3.12"
77
dependencies = [
8-
"httpx>=0.28.1",
8+
"fastmcp>=2.10.1",
99
"inquirer>=3.4.0",
1010
"keyring>=25.6.0",
1111
"linkedin-scraper",
12-
"mcp[cli]>=1.6.0",
1312
"pyperclip>=1.9.0",
1413
]
1514

smithery.yaml

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)