@fre4x/fred 1.0.64 → 1.0.65-beta.1

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 (2) hide show
  1. package/dist/index.js +53 -27
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -45853,20 +45853,30 @@ var {
45853
45853
  // src/api.ts
45854
45854
  var FRED_BASE_URL = "https://api.stlouisfed.org/fred";
45855
45855
  var httpsAgent = new https2.Agent({ keepAlive: true });
45856
+ function getApiKey() {
45857
+ const key = process.env.FRED_API_KEY;
45858
+ if (!key) {
45859
+ throw new Error(
45860
+ "FRED_API_KEY environment variable not set. Please set it to use this server."
45861
+ );
45862
+ }
45863
+ return key;
45864
+ }
45865
+ function buildRequestParams(params) {
45866
+ const filteredEntries = Object.entries(params).filter(
45867
+ ([, value]) => value !== void 0
45868
+ );
45869
+ return Object.fromEntries([
45870
+ ...filteredEntries,
45871
+ ["api_key", getApiKey()],
45872
+ ["file_type", "json"]
45873
+ ]);
45874
+ }
45856
45875
  var FredApiClient = class {
45857
45876
  client;
45858
- apiKey;
45859
45877
  constructor() {
45860
- const key = process.env.FRED_API_KEY;
45861
- if (!key) {
45862
- throw new Error(
45863
- "FRED_API_KEY environment variable not set. Please set it to use this server."
45864
- );
45865
- }
45866
- this.apiKey = key;
45867
45878
  this.client = axios_default.create({
45868
45879
  baseURL: FRED_BASE_URL,
45869
- params: { api_key: this.apiKey, file_type: "json" },
45870
45880
  httpsAgent
45871
45881
  });
45872
45882
  }
@@ -45874,13 +45884,13 @@ var FredApiClient = class {
45874
45884
  const { data } = await this.client.get(
45875
45885
  "/series/search",
45876
45886
  {
45877
- params: {
45887
+ params: buildRequestParams({
45878
45888
  search_text: query,
45879
45889
  limit,
45880
45890
  offset,
45881
45891
  order_by: "popularity",
45882
45892
  sort_order: "desc"
45883
- }
45893
+ })
45884
45894
  }
45885
45895
  );
45886
45896
  return data;
@@ -45889,7 +45899,7 @@ var FredApiClient = class {
45889
45899
  const { data } = await this.client.get(
45890
45900
  "/series",
45891
45901
  {
45892
- params: { series_id: seriesId }
45902
+ params: buildRequestParams({ series_id: seriesId })
45893
45903
  }
45894
45904
  );
45895
45905
  return data;
@@ -45898,12 +45908,12 @@ var FredApiClient = class {
45898
45908
  const { data } = await this.client.get(
45899
45909
  "/series/observations",
45900
45910
  {
45901
- params: {
45911
+ params: buildRequestParams({
45902
45912
  series_id: seriesId,
45903
45913
  limit,
45904
45914
  offset,
45905
45915
  sort_order: "desc"
45906
- }
45916
+ })
45907
45917
  }
45908
45918
  );
45909
45919
  return data;
@@ -45912,13 +45922,13 @@ var FredApiClient = class {
45912
45922
  const { data } = await this.client.get(
45913
45923
  "/category/series",
45914
45924
  {
45915
- params: {
45925
+ params: buildRequestParams({
45916
45926
  category_id: categoryId,
45917
45927
  limit,
45918
45928
  offset,
45919
45929
  order_by: "popularity",
45920
45930
  sort_order: "desc"
45921
- }
45931
+ })
45922
45932
  }
45923
45933
  );
45924
45934
  return data;
@@ -45927,12 +45937,12 @@ var FredApiClient = class {
45927
45937
  const { data } = await this.client.get(
45928
45938
  "/releases",
45929
45939
  {
45930
- params: {
45940
+ params: buildRequestParams({
45931
45941
  limit,
45932
45942
  offset,
45933
45943
  order_by: "release_id",
45934
45944
  sort_order: "desc"
45935
- }
45945
+ })
45936
45946
  }
45937
45947
  );
45938
45948
  return data;
@@ -45941,26 +45951,31 @@ var FredApiClient = class {
45941
45951
  const { data } = await this.client.get(
45942
45952
  "/release/series",
45943
45953
  {
45944
- params: {
45954
+ params: buildRequestParams({
45945
45955
  release_id: releaseId,
45946
45956
  limit,
45947
45957
  offset,
45948
45958
  order_by: "popularity",
45949
45959
  sort_order: "desc"
45950
- }
45960
+ })
45951
45961
  }
45952
45962
  );
45953
45963
  return data;
45954
45964
  }
45955
45965
  async getSources() {
45956
- const { data } = await this.client.get("/sources");
45966
+ const { data } = await this.client.get(
45967
+ "/sources",
45968
+ {
45969
+ params: buildRequestParams({})
45970
+ }
45971
+ );
45957
45972
  return data;
45958
45973
  }
45959
45974
  async getSource(sourceId) {
45960
45975
  const { data } = await this.client.get(
45961
45976
  "/source",
45962
45977
  {
45963
- params: { source_id: sourceId }
45978
+ params: buildRequestParams({ source_id: sourceId })
45964
45979
  }
45965
45980
  );
45966
45981
  return data;
@@ -46174,25 +46189,36 @@ function getClient() {
46174
46189
  return clientInstance;
46175
46190
  }
46176
46191
  function extractErrorMessage(err) {
46192
+ const sanitize = (value) => {
46193
+ const apiKey = process.env.FRED_API_KEY;
46194
+ let sanitized = value.replace(
46195
+ /([?&]api_key=)[^&\s]+/gi,
46196
+ "$1[REDACTED]"
46197
+ );
46198
+ if (apiKey) {
46199
+ sanitized = sanitized.split(apiKey).join("[REDACTED]");
46200
+ }
46201
+ return sanitized;
46202
+ };
46177
46203
  if (typeof err !== "object" || err === null) {
46178
- return String(err);
46204
+ return sanitize(String(err));
46179
46205
  }
46180
46206
  const error48 = err;
46181
46207
  const responseData = error48.response?.data;
46182
46208
  if (typeof responseData === "string" && responseData.trim()) {
46183
- return responseData.trim();
46209
+ return sanitize(responseData.trim());
46184
46210
  }
46185
46211
  if (responseData && typeof responseData === "object") {
46186
46212
  const data = responseData;
46187
46213
  const nestedMessage = data.error_message ?? data.message ?? data.error ?? data.detail;
46188
46214
  if (nestedMessage !== void 0 && nestedMessage !== null) {
46189
- return String(nestedMessage);
46215
+ return sanitize(String(nestedMessage));
46190
46216
  }
46191
46217
  }
46192
46218
  if (error48.message !== void 0 && error48.message !== null) {
46193
- return String(error48.message);
46219
+ return sanitize(String(error48.message));
46194
46220
  }
46195
- return "Request failed.";
46221
+ return sanitize("Request failed.");
46196
46222
  }
46197
46223
  function handleFredError(err) {
46198
46224
  if (typeof err === "object" && err !== null) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fre4x/fred",
3
- "version": "1.0.64",
3
+ "version": "1.0.65-beta.1",
4
4
  "description": "A FRED economic data MCP server for LLMs.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -17,7 +17,7 @@
17
17
  "dev": "tsx src/index.ts",
18
18
  "watch": "tsc -w",
19
19
  "inspector": "npm run build && node ../scripts/run-official-inspector.mjs node dist/index.js",
20
- "test": "vitest run --passWithNoTests --exclude dist"
20
+ "test": "node ../scripts/run-vitest.mjs run --passWithNoTests --exclude dist"
21
21
  },
22
22
  "keywords": [
23
23
  "mcp",