Skip to content

Commit 2262db7

Browse files
committed
feat(metamcp/STDIO): support envFrom (secretRef/configMapRef) for STDIO; keep stdioSecretEnv; move K8s helpers before usage; bump 0.1.15
1 parent f1b14df commit 2262db7

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

charts/metamcp/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apiVersion: v2
22
name: metamcp
33
description: MetaMCP aggregator Helm chart for Kubernetes
44
type: application
5-
version: 0.1.14
5+
version: 0.1.15
66
appVersion: "latest"
77
icon: https://icoretech.github.io/helm/charts/metamcp/logo.png
88
keywords:

charts/metamcp/scripts/provision.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,50 @@ def trpc_post_batch(path, body):
9898
# Wrap body as {"0": body} and use ?batch=1 to match UI routes
9999
return sess.post(f"{BACKEND}{path}?batch=1", headers={'Content-Type':'application/json','Host': SVC}, json={"0": body}, timeout=12)
100100

101+
# K8s helpers (defined before usage)
102+
def k8s_get_secret_val(name: str, key: str):
103+
try:
104+
token = open('/var/run/secrets/kubernetes.io/serviceaccount/token','r').read().strip()
105+
cacert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
106+
ns = NS
107+
url = f"https://kubernetes.default.svc/api/v1/namespaces/{ns}/secrets/{name}"
108+
r = requests.get(url, headers={'Authorization': f'Bearer {token}'}, verify=cacert, timeout=5)
109+
if r.status_code == 200:
110+
data = r.json().get('data',{})
111+
b = data.get(key)
112+
if b:
113+
return base64.b64decode(b).decode()
114+
except Exception:
115+
pass
116+
return None
117+
118+
def k8s_get_secret_data(name: str):
119+
try:
120+
token = open('/var/run/secrets/kubernetes.io/serviceaccount/token','r').read().strip()
121+
cacert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
122+
ns = NS
123+
url = f"https://kubernetes.default.svc/api/v1/namespaces/{ns}/secrets/{name}"
124+
r = requests.get(url, headers={'Authorization': f'Bearer {token}'}, verify=cacert, timeout=5)
125+
if r.status_code == 200:
126+
data = r.json().get('data',{})
127+
return {k: base64.b64decode(v).decode() for k,v in data.items()}
128+
except Exception:
129+
pass
130+
return {}
131+
132+
def k8s_get_configmap_data(name: str):
133+
try:
134+
token = open('/var/run/secrets/kubernetes.io/serviceaccount/token','r').read().strip()
135+
cacert = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt'
136+
ns = NS
137+
url = f"https://kubernetes.default.svc/api/v1/namespaces/{ns}/configmaps/{name}"
138+
r = requests.get(url, headers={'Authorization': f'Bearer {token}'}, verify=cacert, timeout=5)
139+
if r.status_code == 200:
140+
return r.json().get('data',{}) or {}
141+
except Exception:
142+
pass
143+
return {}
144+
101145
# Map existing servers
102146
srv_map = {}
103147
try:
@@ -172,6 +216,14 @@ def trpc_post_batch(path, body):
172216
val = k8s_get_secret_val(ref['name'], ref.get('key') or var)
173217
if val is not None:
174218
env_map[var] = val
219+
# Resolve envFrom (Secrets/ConfigMaps): pull all key=val pairs into env
220+
for src in (s.get('envFrom') or []):
221+
if not isinstance(src, dict):
222+
continue
223+
if 'secretRef' in src and isinstance(src['secretRef'], dict) and src['secretRef'].get('name'):
224+
env_map.update(k8s_get_secret_data(src['secretRef']['name']))
225+
if 'configMapRef' in src and isinstance(src['configMapRef'], dict) and src['configMapRef'].get('name'):
226+
env_map.update(k8s_get_configmap_data(src['configMapRef']['name']))
175227
if env_map:
176228
body['env'] = env_map
177229
r = trpc_post('/trpc/frontend/frontend.mcpServers.create', body)

0 commit comments

Comments
 (0)