You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/about/attributions.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,7 +8,7 @@
8
8
9
9
### ADIF Specification (adif-mcp)
10
10
11
-
The [Amateur Data Interchange Format](https://adif.org.uk/) is the foundation of amateur radio logging interoperability. adif-mcp bundles the complete ADIF 3.1.6 specification — 186 fields, 25 enumerations, and 28 data types.
11
+
The [Amateur Data Interchange Format](https://adif.org.uk/) is the foundation of amateur radio logging interoperability. adif-mcp bundles the complete ADIF 3.1.6 specification — 186 fields, 26 enumerations, and 28 data types.
Copy file name to clipboardExpand all lines: docs/about/index.md
+2-1Lines changed: 2 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -27,7 +27,8 @@ QSO-Graph grew out of the IONIS project's need to integrate with ham radio servi
27
27
-**[IONIS](https://ionis-ai.com/)** — Ionospheric Neural Inference System. Physics-constrained neural network for HF propagation prediction, trained on 14 billion amateur radio observations.
28
28
-**[ionis-mcp](https://pypi.org/project/ionis-mcp/)** — MCP server for propagation analytics using IONIS datasets (175M+ signatures from WSPR, RBN, contests, and PSK Reporter).
29
29
-**[ionis-jupyter](https://pypi.org/project/ionis-jupyter/)** — Jupyter notebooks for propagation research.
30
-
-**[adif-mcp](https://pypi.org/project/adif-mcp/)** — Foundation library for ADIF parsing and credential management. Used by all authenticated QSO-Graph servers.
30
+
-**[qso-graph-auth](https://pypi.org/project/qso-graph-auth/)** — OS keyring credential management for all authenticated QSO-Graph servers.
Copy file name to clipboardExpand all lines: docs/architecture.md
+28-19Lines changed: 28 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Architecture
2
2
3
-
**How QSO-Graph servers work together — one foundation, nine packages, zero cloud dependencies.**
3
+
**How QSO-Graph servers work together — two foundation packages, nine MCP servers, zero cloud dependencies.**
4
4
5
5
---
6
6
@@ -22,14 +22,17 @@ graph TD
22
22
solar["solar-mcp"]
23
23
wspr["wspr-mcp"]
24
24
25
-
subgraph Foundation["adif-mcp (foundation)"]
25
+
subgraph Auth["qso-graph-auth"]
26
26
persona["PersonaManager → OS Keyring"]
27
-
spec["ADIF 3.1.6 Spec (186 fields, 25 enums)"]
27
+
end
28
+
29
+
subgraph ADIF["adif-mcp"]
30
+
spec["ADIF 3.1.6 Spec (186 fields, 26 enums)"]
28
31
valid["Validation Engine"]
29
32
geo["Geospatial (distance, heading)"]
30
33
end
31
34
32
-
eqsl & qrz & lotw & hamqth --> Foundation
35
+
eqsl & qrz & lotw & hamqth --> Auth
33
36
end
34
37
35
38
Servers -->|"HTTPS only"| Services
@@ -41,13 +44,13 @@ graph TD
41
44
42
45
---
43
46
44
-
## Foundation: adif-mcp
47
+
## Foundation: qso-graph-auth + adif-mcp
45
48
46
-
adif-mcp provides three capabilities that all other servers depend on:
49
+
Two foundation packages provide the shared capabilities that other servers depend on.
47
50
48
-
### 1. Persona Management
51
+
### qso-graph-auth — Credential Management
49
52
50
-
Named identities with credentials stored in the OS keyring. One persona serves all services:
53
+
Named identities (personas) with credentials stored in the OS keyring. One persona serves all services:
51
54
52
55
```
53
56
Persona: "ki7mt"
@@ -57,25 +60,31 @@ Persona: "ki7mt"
57
60
└── hamqth → password in OS keyring
58
61
```
59
62
60
-
When a server needs credentials, it calls `adif-mcp` which reads them from the keyring at runtime. Credentials never exist in config files, environment variables, or MCP protocol messages.
63
+
When a server needs credentials, it calls `qso-graph-auth` which reads them from the keyring at runtime. Credentials never exist in config files, environment variables, or MCP protocol messages.
64
+
65
+
```bash
66
+
pip install qso-graph-auth
67
+
qso-auth persona add --name ki7mt --callsign KI7MT --start 2020-01-01
68
+
qso-auth creds set ki7mt eqsl
69
+
```
61
70
62
-
### 2. ADIF 3.1.6 Specification
71
+
### adif-mcp — ADIF 3.1.6 Spec Engine
63
72
64
73
The complete ADIF 3.1.6 spec bundled as JSON:
65
74
66
75
-**186 fields** with data types, valid ranges, and descriptions
67
-
-**25 enumerations** with 4,427 records (Mode, Band, DXCC, Contest_ID, etc.)
76
+
-**26 enumerations** with 4,427+ records (Mode, Band, DXCC, Country, Contest_ID, etc.)
68
77
-**28 data types** (Number, String, Date, GridSquare, etc.)
69
78
70
-
All servers share this spec for consistent parsing and validation.
79
+
Plus validation, parsing, and geospatial tools. See [adif-mcp](servers/adif-mcp.md)for the full 8-tool reference.
71
80
72
-
### 3. Validation Engine
81
+
### Validation Engine
73
82
74
83
Record validation against the full spec:
75
84
76
85
- Field name recognition (186 fields)
77
86
- Data type checking (Number, Date, etc.)
78
-
- Enum membership checking (43 enum-typed fields across 25 enumerations)
87
+
- Enum membership checking (43 enum-typed fields across 26 enumerations)
79
88
- Compound format parsing (CreditList, multi-medium)
80
89
- Conditional validation (Submode depends on Mode)
Credential Lookup ─── OS keyring via adif-mcp (authenticated servers only)
108
+
Credential Lookup ─── OS keyring via qso-graph-auth (authenticated servers only)
100
109
│
101
110
▼
102
111
API Call ──────────── HTTPS only, response parsed
@@ -140,9 +149,9 @@ Each server implements rate limiting appropriate for its service:
140
149
Credentials take one path and never deviate:
141
150
142
151
```
143
-
User ──── adif-mcp creds set ──── OS Keyring (encrypted)
152
+
User ──── qso-auth creds set ──── OS Keyring (encrypted)
144
153
│
145
-
MCP Server ──── adif-mcp read ─────────┘
154
+
MCP Server ──── qso-graph-auth read ───┘
146
155
│ (in-process, never serialized)
147
156
▼
148
157
HTTPS Request ──── credential in Authorization header
@@ -169,9 +178,9 @@ pip install eqsl-mcp # just eqsl-mcp + its dependencies
169
178
pip install pota-mcp # just pota-mcp, no auth needed
170
179
```
171
180
172
-
Servers don't depend on each other. You can install one or all nine.
181
+
Servers don't depend on each other. You can install one or all ten.
173
182
174
-
Authenticated servers depend on `adif-mcp` for credential management. Public servers (POTA, SOTA, Solar, WSPR) have no dependency on adif-mcp.
183
+
Authenticated servers depend on `qso-graph-auth` for credential management. Public servers (POTA, SOTA, IOTA, Solar, WSPR) have no dependency on qso-graph-auth.
0 commit comments