金融数据协议

Fi MCP (Model Context Protocol) 提供对Fi Money平台用户的全面财务数据的访问,使开发者能够构建分析用户财务健康状况、提供洞察并基于实际账户数据创建个性化财务建议的应用程序。

  • by epiFi
  • 云端部署
  • 15 星标
  • 更新于
在 GitHub 查看 epiFi/mcp-docs

使用说明

Fi MCP文档

概述

Fi MCP(模型上下文协议)为Fi Money平台的用户提供对全面财务数据的访问。该MCP使开发人员能够构建应用程序,分析用户的财务状况,提供见解,并根据真实账户数据创建个性化的财务建议。

可用工具

1. fetch_net_worth

目的:使用关联账户的实际数据计算综合净值

用例:

  • 投资组合分析和资产配置见解
  • 净值跟踪和可视化
  • 财务健康评估
  • 投资业绩分析
  • 债务与资产比率计算

数据源:

  • 银行账户余额
  • 共同基金持有量和现值
  • 印度股票投资组合
  • 美国股票投资(如果通过Fi Money应用程序投资)
  • EPF账户余额
  • 信用卡债务和贷款余额
  • 其他关联资产/负债
Response Format
{
  "netWorthResponse": {
    "totalNetWorthValue": {
      "currencyCode": "string" // e.g. INR
      "units": "string" // e.g. total net worth amount
    },
    "assetValues": [
      {
        "netWorthAttribute": "string" // e.g. ASSET_TYPE_EPF
        "value": {
          "currencyCode": "string" // e.g. INR
          "units": "string" // e.g. individual asset value
        }
      }
      // Only one sample asset shown
    ]
  },
  "mfSchemeAnalytics": {
    "schemeAnalytics": [
      {
        "schemeDetail": {
          "amc": "string" // e.g. QUANT_MONEY_MANAGERS
          "nameData": {
            "longName": "string" // e.g. fund name
          },
          "planType": "string" // e.g. DIRECT
          "investmentType": "string" // e.g. OPEN
          "optionType": "string" // e.g. GROWTH
          "nav": {
            "currencyCode": "string" // e.g. INR
            "units": "string" // e.g. NAV whole part
            "nanos": "number" // e.g. NAV fractional part
          },
          "assetClass": "string" // e.g. EQUITY
          "isinNumber": "string" // e.g. INF123L01234
          "categoryName": "string" // e.g. ELSS_TAX_SAVING
          "fundhouseDefinedRiskLevel": "string" // e.g. VERY_HIGH_RISK
        },
        "enrichedAnalytics": {
          "analytics": {
            "schemeDetails": {
              "currentValue": {
                "currencyCode": "string"
                "units": "string"
                "nanos": "number"
              },
              "investedValue": {
                "currencyCode": "string"
                "units": "string"
                "nanos": "number"
              },
              "XIRR": "number" // e.g. % return
              "absoluteReturns": {
                "currencyCode": "string"
                "units": "string"
                "nanos": "number"
              },
              "unrealisedReturns": {
                "currencyCode": "string"
                "units": "string"
                "nanos": "number"
              },
              "navValue": {
                "currencyCode": "string"
                "units": "string"
                "nanos": "number"
              },
              "units": "number" // e.g. 123.01
            }
          }
        }
      }
    ]
  },
  "accountDetailsBulkResponse": {
    "accountDetailsMap": {
      "accountId": {
        "accountDetails": {
          "fipId": "string" // e.g. KotakMahindraBank-FIP
          "maskedAccountNumber": "string" // e.g. XXXXXX1234
          "accInstrumentType": "string" // e.g. ACC_INSTRUMENT_TYPE_DEPOSIT
          "ifscCode": "string" // e.g. ABCD0000123
          "accountType": {
            "depositAccountType": "string" // e.g. DEPOSIT_ACCOUNT_TYPE_SAVINGS
          },
          "fipMeta": {
            "name": "string" // e.g. Kotak Mahindra Bank
            "displayName": "string" // e.g. Kotak
            "bank": "string" // e.g. KOTAK
          }
        },
        "depositSummary": {
          "accountId": "string"
          "currentBalance": {
            "currencyCode": "string"
            "units": "string"
            "nanos": "number"
          },
          "balanceDate": "ISODate" // e.g. 2025-01-01T11:59:59.149Z
          "depositAccountType": "string"
          "branch": "string"
          "ifscCode": "string"
          "openingDate": "ISODate"
          "depositAccountStatus": "string"
        },
        "equitySummary": {
          "accountId": "string"
          "currentValue": {
            "currencyCode": "string"
            "units": "string"
            "nanos": "number"
          },
          "holdingsInfo": [
            {
              "isin": "string" // e.g. INE00H001014
              "issuerName": "string" // e.g. EPIFI LIMITED
              "type": "string" // e.g. EQUITY_HOLDING_TYPE_DEMAT
              "units": "number" // e.g. quantity held
              "lastTradedPrice": {
                "currencyCode": "string"
                "units": "string"
                "nanos": "number"
              },
              "isinDescription": "string" // e.g. EPIFI LIMITED-EQ
            }
          ]
        }
      }
    }
  }
}

示例响应

错误处理:

  • 如果没有连接任何金融账户,则返回空结果
  • 如果未检测到,则提示用户连接共同基金账户
  • 仅包括来自关联账户的数据(无估计)

2. fetch_credit_report

目的:检索综合信用报告信息

用例:

  • 信用评分监控
  • 基于利率的贷款优先级
  • 信贷利用分析

数据包括:

  • 信用评分
  • 主动、已关闭的贷款详细信息及利率
  • 信用卡使用率
  • 最近的信用查询
  • 出生日期信息
Response Format
{
  "creditReports": [
    {
      "creditReportData": {
        "userMessage": {
          "userMessageText": "string" // e.g. Normal Response
        },
        "creditProfileHeader": {
          "reportDate": "string" // e.g. 20250101
          "reportTime": "string" // e.g. 235959
        },
        "currentApplication": {
          "currentApplicationDetails": {
            "enquiryReason": "string" // e.g. 6
            "amountFinanced": "string" // e.g. 0
            "durationOfAgreement": "string" // e.g. 0
            "currentApplicantDetails": {
              "dateOfBirthApplicant": "string" // e.g. 19690131
            }
          }
        },
        "creditAccount": {
          "creditAccountSummary": {
            "account": {
              "creditAccountTotal": "string" // e.g. 2
              "creditAccountActive": "string" // e.g. 2
              "creditAccountDefault": "string" // e.g. 0
              "creditAccountClosed": "string" // e.g. 0
              "cadSuitFiledCurrentBalance": "string" // e.g. 0
            },
            "totalOutstandingBalance": {
              "outstandingBalanceSecured": "string" // e.g. 10000
              "outstandingBalanceSecuredPercentage": "string" // e.g. 20
              "outstandingBalanceUnSecured": "string" // e.g. 40000
              "outstandingBalanceUnSecuredPercentage": "string" // e.g. 80
              "outstandingBalanceAll": "string" // e.g. 50000
            }
          },
          "creditAccountDetails": [
            {
              "identificationNumber": "string" // e.g. AV12345678
              "subscriberName": "string" // e.g. Federal Bank
              "portfolioType": "string" // e.g. R
              "accountType": "string" // e.g. 10
              "openDate": "string" // e.g. 20250101
              "creditLimitAmount": "string" // e.g. 500000
              "highestCreditOrOriginalLoanAmount": "string" // e.g. 80000
              "accountStatus": "string" // e.g. 11
              "paymentRating": "string" // e.g. 0
              "paymentHistoryProfile": "string" // e.g. 000000000000000000000000?00000000000
              "currentBalance": "string" // e.g. 0
              "amountPastDue": "string" // e.g. 0
              "dateReported": "string" // e.g. 20250701
              "dateOfLastPayment": "string" // e.g. 20250701
              "repaymentTenure": "string" // e.g. 0
              "dateOfAddition": "string" // e.g. 20220101
              "currencyCode": "string" // e.g. INR
              "accountHolderTypeCode": "string" // e.g. 1
            }
          ]
        },
        "matchResult": {
          "exactMatch": "string" // e.g. Y
        },
        "totalCapsSummary": {
          "totalCapsLast7Days": "string" // e.g. 0
          "totalCapsLast30Days": "string" // e.g. 0
          "totalCapsLast90Days": "string" // e.g. 0
          "totalCapsLast180Days": "string" // e.g. 0
        },
        "nonCreditCaps": {
          "nonCreditCapsSummary": {
            "nonCreditCapsLast7Days": "string" // e.g. 0
            "nonCreditCapsLast30Days": "string" // e.g. 0
            "nonCreditCapsLast90Days": "string" // e.g. 0
            "nonCreditCapsLast180Days": "string" // e.g. 0
          }
        },
        "score": {
          "bureauScore": "string" // e.g. 800
        },
        "caps": {
          "capsSummary": {
            "capsLast7Days": "string" // e.g. 0
            "capsLast30Days": "string" // e.g. 0
            "capsLast90Days": "string" // e.g. 0
            "capsLast180Days": "string" // e.g. 0
          },
        }
      },
      "vendor": "EXPERIAN"
    }
  ]
}


示例响应

错误处理:

  • 如果未连接,则返回“无可用信用评分数据”
  • 提示用户在Fi Money应用程序中连接信用档案

3. fetch_epf_details

目的:访问员工公积金账户信息

用例:

  • 退休计划计算
  • EPF贡献跟踪
  • 利息收益分析
  • 雇主出资验证

数据包括:

  • 经常账户余额
  • 雇主和雇佣详情
  • 员工供款总额
  • 雇主出资总额
Response Format
{
  "uanAccounts": [
    {
      "phoneNumber": {}, // object (structure not specified)
      "rawDetails": {
        "est_details": [
          {
            "est_name": "string", // e.g. Company Name
            "member_id": "string", // e.g. RJRAJ12345690000012345
            "office": "string", // e.g. (RO)JAIPUR
            "doj_epf": "string", // e.g. 01-01-2020
            "doe_epf": "string", // e.g. 01-01-2025
            "doe_eps": "string", // e.g. 01-01-2025
            "pf_balance": {
              "is_pf_full_withdrawn": true, // boolean
              "employee_share": {
                "debit": "string", // e.g. 12345
                "credit": "string" // e.g. 12345
              },
              "employer_share": {
                "debit": "string", // e.g. 1234
                "credit": "string" // e.g. 1234
              }
            }
          },
         "overall_pf_balance": {
          "pension_balance": "string", // e.g. 12345
          "current_pf_balance": "string", // e.g. 54321
          "employee_share_total": {
            "debit": "string", // e.g. 12345
            "credit": "string", // e.g. 54321
            "balance": "string" // e.g. 12345
          },
          "employer_share_total": {
            "debit": "string", // e.g. 1234
            "credit": "string", // e.g. 12345
            "balance": "string" // e.g. 123456
          }
        }
      }
    }
  ]
}


示例响应

错误处理:

  • 指示用户在未连接的情况下通过Fi Money应用程序链接EPF帐户

4. fetch_mf_transactions

目的:检索共同基金交易历史记录以进行投资组合分析

用例:

  • XIRR(扩展内部收益率)计算
  • 投资业绩跟踪
  • 交易模式分析
  • 投资组合再平衡见解

当前作用域:

  • 共同基金交易(买入、卖出、SIP等)
  • 交易日期和金额
  • 资金交易历史
Response Format
{
  "transactions": [
    {
      "isinNumber": "string", // e.g. INF123L01234
      "folioId": "string", // e.g. 1234567890
      "externalOrderType": "string", // e.g. BUY
      "transactionDate": "string", // e.g. 2025-01-01T23:59:59Z (ISO format)
      "purchasePrice": {
        "currencyCode": "string", // e.g. INR
        "units": "string", // e.g. 250
        "nanos": "number" // e.g. 785200000
      },
      "transactionAmount": {
        "currencyCode": "string", // e.g. INR
        "units": "string", // e.g. 9999
        "nanos": "number" // e.g. 500000000
      },
      "transactionUnits": "number", // e.g. 98.765
      "transactionMode": "string", // e.g. N
      "schemeName": "string", // e.g. Epifi Tax Saver Fund - Direct Plan
      "stampDuty": "number" // e.g. 0.1
    }
  ]
}

示例响应

响应结构说明:

  • purchasePrice:交易执行时的资产净值
  • transactionAmount:投资/赎回总额
  • transactionUnits:买入/卖出的单位数量
  • transactionMode:“N”表示正常,其他模式可能包括SIP等。
  • externalOrderType:“买入”表示买入,“卖出”表示赎回
  • 使用金额 units (主要金额)和 nanos (分数部分)结构
  • XIRR计算需要使用此事务数据单独完成

错误处理:

  • 返回可用数据,明确指出限制
  • 指定不包括哪些交易类型
  • SIP性能评估员

5. fetch_bank_transactions

目的:访问连接到Fi Money应用程序的银行交易数据

用例:

  • 连接到Fi Money应用程序的所有银行交易数据

数据包括:

  • 交易金额
  • 交易记录
  • 交易日期
  • 交易后的当前余额
Response Format
{
  "schemaDescription": "A list of bank transactions. Each 'txns' field is a list of data arrays with schema: [transactionAmount, transactionNarration, transactionDate, transactionType (1 for CREDIT, 2 for DEBIT, 3 for OPENING, 4 for INTEREST, 5 for TDS, 6 for INSTALLMENT, 7 for CLOSING and 8 for OTHERS), transactionMode, currentBalance].\n We currently have have only last two month transaction, older transaction are coming soon...",
  "bankTransactions": [
    {
      "bank": "HDFC Bank",
      "txns": [
        [
          "80085",
          "UPI-SHEETAL RAVINDRA DA-SHEETAL.DAMBAL@OKSBI-SBIN0010411-109209224698-SUFYAN",
          "2025-07-09",
          1,
          "CARD_PAYMENT",
          "-79109"
        ],
        [
          "80677",
          "UPI-DREAMPLUG TECHNOLOGI-CRED@AXISB-UTIB0000114-009400589368-CREDIT CARD BILL P",
          "2025-07-09",
          2,
          "FT",
          "1568"
        ]
      ]
    }
  ]
}


示例响应


6. fetch_stock_transactions

目的:从连接到Fi Money应用程序的帐户访问股票交易

用例:

  • 所有已关联的股票交易

数据包括:

  • ISIN作为交易标识符
  • 交易类型(买入、卖出、分红)
  • 交易日期
  • 交易导航值
Response Format
{
  "schemaDescription": "A list of stock transactions. Each 'txns' field is a list of data arrays with schema: [transactionType (1 for BUY, 2 for SELL, 3 for BONUS, 4 for SPLIT), transactionDate, quantity, navValue]. nav value may not be present in some of the transactions",
  "stockTransactions": [
    {
      "isin": "INE0BWS23018",
      "txns": [
        [
          1,
          "2023-05-04",
          100
        ],
        [
          1,
          "2023-05-04",
          170
        ]
      ]
    },
    {
      "isin": "INF204KB14I5",
      "txns": [
        [
          1,
          "2023-05-04",
          100,
          10.51
        ]
      ]
    }
  ]
}

示例响应


集成指南

错误处理最佳实践

  1. 连接状态:在显示数据之前,始终检查所需的帐户是否已连接
  2. 数据可用性:处理特定数据类型可能不可用的情况
  3. 用户指南:就如何连接丢失的帐户提供明确的说明
  4. 故障弱化:设计UI,以便在某些帐户未连接时处理部分数据

安全考虑

  1. 数据隐私:切勿存储或缓存敏感的财务数据
  2. 认证:在访问MCP之前,确保正确的用户身份验证
  3. 数据显示:使用适当的格式显示财务数据

性能优化

  1. 批处理:尽可能拨打与集团相关的MCP电话
  2. 错误恢复:对失败的调用实施重试机制

如何创建MCP客户端

用于连接到服务器的最简单的Python MCP客户端

from mcp.client.streamable_http import streamablehttp_client
from mcp.client.session import ClientSession
import asyncio
 
async def main():
    try:
        async with streamablehttp_client("https://mcp.fi.money:8080/mcp/stream") as (
            read_stream,
            write_stream,
            _,
        ):
            async with ClientSession(
                read_stream,
                write_stream,
            ) as session:
                await session.initialize()
                tools = await session.list_tools()
                print(tools)
    except Exception as e:
        print(f"error: {e}")

if __name__ == "__main__":
    asyncio.run(main())


集成代码示例

基本净值提取

Javascript代码段

async function getUserNetWorth() {
  try {
    const response = await mcp.call('networth:fetch_net_worth');
    if (response.netWorthResponse && response.netWorthResponse.totalNetWorthValue) {
      const totalValue = response.netWorthResponse.totalNetWorthValue.units;
      const assets = response.netWorthResponse.assetValues;
      displayNetWorth(totalValue, assets);
    } else {
      promptAccountConnection();
    }
  } catch (error) {
    handleError(error);
  }
}

信用评分监控

Javascript代码段

async function getCreditInsights() {
  try {
    const response = await mcp.call('networth:fetch_credit_report');
    if (response.creditReports && response.creditReports.length > 0) {
      const creditData = response.creditReports[0].creditReportData;
      const score = creditData.score.bureauScore;
      const dateOfBirth = creditData.currentApplication.currentApplicationDetails.currentApplicantDetails.dateOfBirthApplicant;
      const accounts = creditData.creditAccount.creditAccountDetails;
      
      analyzeCreditScore(score, dateOfBirth, accounts);
    } else {
      promptCreditConnection();
    }
  } catch (error) {
    showCreditError();
  }
}

EPF余额跟踪

Javascript代码段

async function getEPFDetails() {
  try {
    const response = await mcp.call('networth:fetch_epf_details');
    if (response.uanAccounts && response.uanAccounts.length > 0) {
      const epfData = response.uanAccounts[0].rawDetails;
      const totalBalance = epfData.overall_pf_balance.current_pf_balance;
      const employeeShare = epfData.overall_pf_balance.employee_share_total.balance;
      const employerShare = epfData.overall_pf_balance.employer_share_total.balance;
      
      displayEPFBreakdown(totalBalance, employeeShare, employerShare);
    } else {
      promptEPFConnection();
    }
  } catch (error) {
    handleEPFError();
  }
}

共同基金XIRR计算

Javascript代码段

async function calculatePortfolioXIRR() {
  try {
    const response = await mcp.call('networth:fetch_mf_transactions');
    if (response.transactions && response.transactions.length > 0) {
      const transactions = response.transactions;
      
      // Group transactions by scheme
      const groupedTransactions = transactions.reduce((acc, tx) => {
        if (!acc[tx.isinNumber]) {
          acc[tx.isinNumber] = [];
        }
        acc[tx.isinNumber].push({
          date: new Date(tx.transactionDate),
          amount: parseFloat(tx.transactionAmount.units) + 
                 (tx.transactionAmount.nanos / 1000000000),
          type: tx.externalOrderType
        });
        return acc;
      }, {});
      
      // Calculate XIRR for each scheme
      calculateXIRRByScheme(groupedTransactions);
    } else {
      showNoTransactionsMessage();
    }
  } catch (error) {
    handleTransactionError();
  }
}

关键数据结构注释

货币格式

API中的所有货币值都使用以下结构:

{
  "currencyCode": "INR",
  "units": "string_value",
  "nanos": "numeric_fractional_value"
}
  • units:字符串形式的主要货币金额
  • nanos:分数部分(1纳米=1/100亿单位)
  • 要获取实际值: parseFloat(units) + (nanos / 1000000000)

资产类型映射

  • ASSET_TYPE_EPF:员工公积金余额
  • ASSET_TYPE_INDIAN_SECURITIES:印度股票持有量
  • ASSET_TYPE_SAVINGS_ACCOUNTS:银行账户余额
  • ASSET_TYPE_MUTUAL_FUND:共同基金投资组合价值
  • ASSET_TYPE_US_SECURITIES:美国股票投资

信用账户类型

  • 账户类型“10”:信用卡账户
  • 帐户状态“11”:活动帐户
  • 付款评级“0”:当前(无延迟)

日期格式

  • EPF日期:“DD-MM-YYYY”格式
  • 交易日期:ISO 8601格式(“YYYY-MM-DDTHH:MM:SSZ”)
  • 信用报告日期:“YYYYMMDD”格式

常见问题

  • 部分数据:某些工具可能会根据用户当前连接的帐户返回有限的数据
  • 身份验证错误:确保正确的MCP身份验证和权限

最佳实践

  • 提供清晰的错误消息和可操作的步骤
  • 为异步操作实现适当的加载状态

获取帮助

  • 查看错误消息以获取具体指导
  • 使用不同的帐户连接场景进行测试

本文档涵盖了Fi MCP的当前版本。功能和性能可能会在未来的版本中扩展。