@@ -23,6 +23,7 @@ def parse_args():
23
23
parser = argparse .ArgumentParser (description = "Airtable MCP Server" )
24
24
parser .add_argument ("--token" , dest = "api_token" , help = "Airtable Personal Access Token" )
25
25
parser .add_argument ("--base" , dest = "base_id" , help = "Airtable Base ID" )
26
+ parser .add_argument ("--config" , dest = "config_json" , help = "Configuration as JSON (for Smithery integration)" )
26
27
return parser .parse_args ()
27
28
28
29
# Set up logging
@@ -32,28 +33,45 @@ def parse_args():
32
33
# Parse arguments
33
34
args = parse_args ()
34
35
36
+ # Handle config JSON from Smithery if provided
37
+ config = {}
38
+ if args .config_json :
39
+ try :
40
+ # Strip any trailing quotes or backslashes that might be present
41
+ config_str = args .config_json .rstrip ('\\ "' )
42
+ logger .info (f"Parsing config: { config_str } " )
43
+ config = json .loads (config_str )
44
+ logger .info (f"Successfully parsed config: { config } " )
45
+ except json .JSONDecodeError as e :
46
+ logger .error (f"Failed to parse config JSON: { e } " )
47
+ logger .error (f"Raw config string: { args .config_json } " )
48
+
35
49
# Create MCP server
36
50
app = FastMCP ("Airtable Tools" )
37
51
38
- # Get token from arguments or environment
39
- token = args .api_token or os .environ .get ("AIRTABLE_PERSONAL_ACCESS_TOKEN" , "" )
40
- base_id = args .base_id or os .environ .get ("AIRTABLE_BASE_ID" , "" )
52
+ # Get token from arguments, config, or environment
53
+ token = args .api_token or config .get ("airtable_token" , "" ) or os .environ .get ("AIRTABLE_PERSONAL_ACCESS_TOKEN" , "" )
54
+ # Clean up token if it has trailing quote
55
+ if token and token .endswith ('"' ):
56
+ token = token [:- 1 ]
57
+
58
+ base_id = args .base_id or config .get ("base_id" , "" ) or os .environ .get ("AIRTABLE_BASE_ID" , "" )
41
59
42
60
if not token :
43
- logger .warning ("No Airtable API token provided. Use --token or set AIRTABLE_PERSONAL_ACCESS_TOKEN environment variable." )
61
+ logger .warning ("No Airtable API token provided. Use --token, --config, or set AIRTABLE_PERSONAL_ACCESS_TOKEN environment variable." )
44
62
else :
45
63
logger .info (f"Using Airtable token: { token [:5 ]} ...{ token [- 5 :]} " )
46
64
47
65
if base_id :
48
66
logger .info (f"Using base ID: { base_id } " )
49
67
else :
50
- logger .warning ("No base ID provided. Use --base or set AIRTABLE_BASE_ID environment variable." )
68
+ logger .warning ("No base ID provided. Use --base, --config, or set AIRTABLE_BASE_ID environment variable." )
51
69
52
70
# Helper functions for Airtable API calls
53
71
async def api_call (endpoint , method = "GET" , data = None , params = None ):
54
72
"""Make an Airtable API call"""
55
73
if not token :
56
- return {"error" : "No Airtable API token provided. Use --token or set AIRTABLE_PERSONAL_ACCESS_TOKEN environment variable." }
74
+ return {"error" : "No Airtable API token provided. Use --token, --config, or set AIRTABLE_PERSONAL_ACCESS_TOKEN environment variable." }
57
75
58
76
headers = {
59
77
"Authorization" : f"Bearer { token } " ,
0 commit comments